【问题标题】:Dealing with null values in chained linq-to-sql query expressions处理链式 linq-to-sql 查询表达式中的空值
【发布时间】:2011-01-20 12:53:47
【问题描述】:

我有一个 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();

有解决这个问题的语法技巧吗?

【问题讨论】:

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


    【解决方案1】:

    尝试使用Select 获取Date 成员:

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

    【讨论】:

    • 我怎么没想到这么写!?很简单!谢谢:)
    猜你喜欢
    • 1970-01-01
    • 2020-12-28
    • 2021-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多