处理链式linq-to-sql查询表达式中的空值

时间:2011-01-20 12:53:48

标签: c# linq-to-sql null iqueryable chaining

我有一个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 个答案:

答案 0 :(得分:1)

尝试使用Select获取Date成员:

o.Customer.CustomerOrderRecords
    .Where(x => x.PartNumber == o.PartNumber)
    .OrderByDescending(x => x.Date)
    .Select(x => (DateTime?)x.Date)
    .FirstOrDefault()