【问题标题】:LINQ check if FirstOrDefault is null and use itLINQ 检查 FirstOrDefault 是否为空并使用它
【发布时间】:2012-08-23 17:03:50
【问题描述】:

我正在编写一个在OrderBy 查询之后使用FirstOrDefault 的查询,它应该首先检查它是否不为空,然后使用其中的一些数据。有没有比这样写更好的方法:

int count = db.Items.Count(i => 
          i.Assignments.OrderByDescending(a => 
                a.DateAssigned).FirstOrDefault() != null
          && 
          i.Assignments.OrderByDescending(a =>
                a.DateAssigned).FirstOrDefault().DateReturned == null)

这段代码的作用是有些项目有很多分配,我按日期获取最新的分配,然后检查它是否存在,然后对属性运行条件 (DateReturned)。如您所见,这个查询很长,我的大多数查询看起来像这样,我首先检查 null 然后使用它们的属性对其运行第二个查询。有更好的方法吗?

【问题讨论】:

  • 什么是itemsQuery?基本上,这是在 LINQ to Objects 中还是其他什么?
  • 当您确实有长的 LINQ 查询时,您可以在其中添加一些换行符以使其真正可读...
  • 还有一些缩进也不错。
  • 如果您使用 VB.NET,则不需要执行 .OrderByDes 并包含谓词,您只需使用 OrderBy 保留关键字后跟 ASC 或 DES 保留关键字,然后说“什么都没有”而对于第二部分“IsNot Nothing”,更漂亮:)

标签: c# linq entity-framework


【解决方案1】:

拨打.Any(a => a.DateReturned == null)查看是否有符合条件的物品。

如果您只想查看最新的作业,请在.Any() 之前添加.Take(1)

【讨论】:

    【解决方案2】:

    我的看法:

    int count = 
    itemsQuery.Select(i => i.Assignments.OrderByDescending(a => a.DateAssigned))
              .Count(i => i.FirstOrDefault() != null &&  
                          i.First().DateReturned == null);
    

    【讨论】:

    • EF 不接受带有匿名委托的 lambda 表达式,因为它无法转换为表达式树。
    【解决方案3】:

    您可以将结果放入变量中以避免重复执行相同的操作:

    int count = itemsQuery.Count(i => {
      var f = i.Assignments.OrderByDescending(a => a.DateAssigned).FirstOrDefault();
      return f != null && f.DateReturned == null;
    });
    

    【讨论】:

    • EF 不接受带有匿名委托的 lambda 表达式,因为它无法转换为表达式树。
    猜你喜欢
    • 1970-01-01
    • 2010-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-04
    • 2019-01-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多