Работа с нулевыми значениями в цепочечных выражениях запросов linq-to-sql - PullRequest
2 голосов
/ 20 января 2011

У меня есть запрос к хранилищу L2S, который я стараюсь написать хорошим способом. Это выглядит примерно так ...

_orderRepository
    .GetAllByFilter(o => o.CustomerId == id)
    .Select(o => 
         new CustomerOrderRecord
         (
              o.Id,
              o.PartNumber,
              o.Date
              // ... etc, more order details

             /* Here I need the last DateTime? the customer placed
                an order for this item, which might be null.
                So I end up with the following horrible part of
                the query */  
              o.Customer.CustomerOrderRecords
                    .Where(x => x.PartNumber == o.PartNumber)
                    .OrderByDescending(x => x.Date).FirstOrDefault()
                    == null ? null : 
                          o.Customer.CustomerOrderRecords
                             .Where(x => x.PartNumber == o.PartNumber)
                             .OrderByDescending(x => x.Date).First().Date;

         )).ToList();

Так что, надеюсь, вы видите проблему в том, что мне приходится писать всю цепочку запросов дважды, чтобы выполнить нулевую проверку при получении значения LastOrdered.

Это должно быть написано в строке (я думаю), потому что GetAllByFilter возвращает IQueryable.

Я пытался использовать промежуточную переменную в операторе select, поэтому у меня было бы что-то вроде следующего, но я не мог получить что-то подобное для компиляции.

.Select(o => 
         new CustomerOrderRecord
         (
              o.Id,
              o.PartNumber,
              o.Date
              // ... etc, more order details

              var last = o.Customer.CustomerOrderRecords
                    .Where(x => x.PartNumber == o.PartNumber)
                    .OrderByDescending(x => x.Date).FirstOrDefault()
                    == null ? null : last.Date;

          )).ToList();

Существует ли синтаксическая уловка, которая решает эту проблему?

1 Ответ

1 голос
/ 20 января 2011

Попробуйте использовать Select для извлечения Date члена:

o.Customer.CustomerOrderRecords
    .Where(x => x.PartNumber == o.PartNumber)
    .OrderByDescending(x => x.Date)
    .Select(x => (DateTime?)x.Date)
    .FirstOrDefault()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...