Автоматическая проверка NULL-отношений с запросами LINQ - PullRequest
11 голосов
/ 27 февраля 2012

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

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

- Company
- Product
- Item
- Order

и допустим, что Company имеет 0 или более Products, Product имеет 0 или более Items, а Item имеет 0 или более Orders.

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

IQueryable<Order> myOrders = GetMyOrders();

Теперь давайте предположим, что я хочу запросить заказы для определенного Company.Name, но у меня есть ситуация, когда каждый родительский идентификатор таблицы может быть 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");

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

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

1 Ответ

3 голосов
/ 27 февраля 2012

есть известные паттерны (см. Шаблон объекта Null). Также вы можете прочитать эту статью

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...