2012-02-27 6 views
11

Я использую LINQ to SQL для обработки запросов к базе данных для приложения, над которым я работаю.Автоматическая проверка связей NULL с запросами LINQ

Для целей этого примера, представьте, у меня есть несколько таблиц, как так

- Company 
- Product 
- Item 
- Order 

и позволяет сказать Company имеет 0 или более Products, Product имеет 0 или более Items, и Item имеет 0 или больше Orders.

Теперь давайте так я получил список Orders, что-то вроде:

IQueryable<Order> myOrders = GetMyOrders(); 

Теперь давайте говорить, что я хочу, чтобы запросить заказы для конкретного Company.Name, но есть ситуации, когда каждая таблица родитель ID может быть NULL (я знаю, что это не кажется логичным с моим, например, данные, но это просто пример)

Делая предположение, что нет NULL родительских идентификаторов я мог бы сделать это:

var filteredOrders = myOrders.Where(x => x.Item.Product.Company.Name == "Company1"); 

Это будет работать нормально, однако, поскольку значения родительских идентификаторов могут быть NULL, мне нужно проверить каждый родительский объект, чтобы убедиться, что он не null перед запросом следующего родителя (в противном случае я получу исключение). Так что я сделать что-то вроде:

var filteredOrders = myOrders.Where(x => 
    x.Item != null && 
    x.Item.Product != null && 
    x.Item.Product.Company != null && 
    x.Item.Product.Company.Name == "Company1"); 

Так что мой вопрос: Есть ли лучший способ (с точки зрения читабельности и легкости кодирования), чтобы сделать это, чем того, чтобы включать в себя все нулевые чеки? Любые нулевые родители, найденные на этом пути, должны привести к исключению из результирующего списка.

Пожалуйста, никаких предложений по предотвращению неопределенные родителей, база данных не будет не меняется (и это вполне допустимо в любом случае)

+0

Лучше, чем у исполнителя? Я так не думаю. Я вообще не могу думать, что вы можете избавиться от всех этих «нулевых» проверок. Лучше по отношению к более красивому коду? Я бы пошел с предложением Лонли-Локли. – InBetween

+0

@InBetween: Извините, когда я говорю лучше, я имел в виду больше для удобочитаемости. Но имея в виду мой комментарий к сообщению Lonli-Lokli, где я упомянул о желаемом, чтобы в конечном итоге запустить его как SQL-запрос, а не сначала возвращать все результаты. – musefan

+0

Звучит как идеальное приложение для внутренних объединений, которое будет уничтожать все элементы с нулевыми ссылками , Присоедините все таблицы и отфильтруйте результат по названию компании. (Но это не будет более читаемым) – Stephan

ответ

3

есть известные pattren (см Null шаблон объекта). Также вы можете прочитать this article

+1

Я прочитал эту статью, и это было, конечно, интересно. Однако из-за моего использования мне интересно, подходит ли это для меня. Предполагая, что ваше предложение состоит в том, чтобы создать метод расширения, я боюсь, что у меня будет большой успех для меня, поскольку я использую IQueryable и не хочу выполнять запрос по всем результатам. Я, конечно, предполагаю, что мне нужно будет это сделать (например, работать со списком ) - может быть, с этим умом я остаюсь с необходимостью делать что-то долгий путь ... любые мысли? – musefan

+0

Затем вы должны написать свою собственную реализацию провайдера linq-to-sql и объединить эти методы расширения в sql-запросы, как это было предложено выше. Или вы можете просто написать эти вопросы с нуля. –

Смежные вопросы