【问题标题】:Get the earliest date in a LINQ expression获取 LINQ 表达式中的最早日期
【发布时间】:2016-03-31 06:25:07
【问题描述】:

我在 WebAPI 控制器中有以下 LINQ:

MyDate = i.Products.FirstOrDefault().Date

它按预期工作。但是,产品是一个集合,所以可以有很多日期。以上只是选择了第一个。

我真正想做的是找到日期,最早的时间,然后选择那个。

看起来怎么样?

【问题讨论】:

  • .FirstOrDefault() 可以返回 null。在执行.Date 时,您的代码容易受到 NullReferenceExceptions 的影响。查看产品列表为空的情况。还要注意您使用的答案,用一个空列表对其进行测试 - 那里很可能存在同样的问题。

标签: c# asp.net linq


【解决方案1】:

如果您只想要日期而不是整个产品,使用MaxMin 会更清晰一些。

MyDate = i.Products.Select(x => x.Date).Max()

如果您确实想要该产品,则需要按日期排序,然后选择第一个。

MyProduct = i.Products.OrderBy(x => x.Date).FirstOrDefault()

【讨论】:

  • 排序是一项昂贵的操作,不应在不必要时使用。您对日期最近的产品的查询可以写成Product oldestProduct = i.Products.SingleOrDefault(x => x.Date == i.Products.Min(y=>y.Date));DateTime minDate = i.Products.Min(x => x.Date); Product oldestProduct = i.Products.SingleOrDefault(x => x.Date == minDate); 注意:后一个版本更具可读性,但需要两个单独的查询。
  • @SørenD.Ptæus 订购成本取决于订购方式。如果它正在访问数据库并且日期有一个有序索引,那么它会非常便宜。
  • 注意:对空集合执行.Max().Min() 会引发异常!
  • @SørenD.Ptæus 请注意,如果列表中的多个项目具有相同的日期值并且与 Min 值匹配,SingleOrDefault 将引发异常。
  • @GalacticCowboy 好点。尽管对于时间戳来说相同的日期值不太可能,但我同意使用SingleOrDefault 会留下出错的机会。如果Date 不是时间戳,而只是一个没有独特Ticks 值或任何其他时间信息的日期,那么您描述的场景确实是一个真正的问题,FirstOrDefault 在这里是一个更好的选择。
【解决方案2】:

这种方式更简洁:

var earlyDate = i.Products.Min(p=>p.Date);

但你确定Product != null

【讨论】:

    【解决方案3】:

    你可以使用

     i.Products.OrderByDescending(x => x.Date).FirstOrDefault().Date;
    

    【讨论】:

    • 这将为您提供最大(最近)日期
    • 没有OrderByAscending
    • 是的,我才意识到
    【解决方案4】:

    这是一个 lambda 表达式,它将为您提供最小(最早)日期

    DateTime earliestDate = i.Products.Min(p => p.Date);
    

    【讨论】:

      【解决方案5】:

      很简单,如果您需要最早使用OrderBy 并且需要最早使用OrderByDescending

       i.Products.OrderBy(x => x.Date).Select(x => x.Date).FirstOrDefault();
       i.Products.OrderByDescending(x => x.Date).Select(x => x.Date).FirstOrDefault();
      

      【讨论】:

        【解决方案6】:

        只需按日期排序:

        MyDate = i.Products.OrderBy(x => x.Date).Select(x => x.Date).FirstOrDefault();
        

        【讨论】:

          【解决方案7】:

          优化的方式是:

          i.Products.OrderByDescending(x => x.Date).Select(x => x.Date).FirstOrDefault();
          

          【讨论】:

            【解决方案8】:
            i.Products.OrderBy(x => x.Date).FirstOrDefault().Date;
            

            它必须是 orderby 而不是 orderbydescending。 orderbydescending 会先给你最晚的日期,order by 会先给你最早的日期。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-07-12
              • 2021-09-29
              • 2021-03-19
              • 2021-11-14
              • 2020-10-06
              相关资源
              最近更新 更多