У меня есть запрос к хранилищу 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();
Существует ли синтаксическая уловка, которая решает эту проблему?