【问题标题】:Lambda Expression for Latest Date最新日期的 Lambda 表达式
【发布时间】:2012-04-11 10:53:48
【问题描述】:

假设我有一个模型定义为:Foo {Id, Date}

有没有办法制作一个布尔 lambda 表达式,以便我可以获得最新日期的 Foo?类似于(f => f.Date IsLatest)

【问题讨论】:

    标签: c# linq entity-framework lambda


    【解决方案1】:
    var latest = model.OrderByDescending(m => m.Date).FirstOrDefault();
    

    【讨论】:

    • 结果不会是DateTime
    • 参见 Jon Skeet 的 morelinq 库中的 MaxBy()
    【解决方案2】:

    要做出判断日期是否为最新的表达式,您需要知道最新日期,即:

    DateTime latestDate = items.Max(f => f.Date);
    
    var latestItems = items.Where(f => f.Date == latestDate);
    

    另一种方法是对项目进行排序:

    var latestItem = items.OrderBy(f => f.Date).First();
    

    或者使用聚合:

    var latestItem = items.Aggregate((d, v) => v.Date > d.Date ? v : d);
    

    【讨论】:

    • 我想你的意思可能是Foo.Where(f => f.Date == latestDate); :)
    【解决方案3】:

    鉴于您尚未提供有关实体名称的任何信息(我假设此处为 foos);像这样:

    var latest = foos.OrderByDescending(f => f.Date).FirstOrDefault();
    

    如果有 多个 的最大日期(我知道你说'最新的 Foo ......'但我不知道你在这里的时间分辨率)比您实际上会追求更像 Guffa 的答案。

    请注意,任一解决方案都将从日期列上的索引中受益匪浅。如果没有索引并且表变大了?那么它可能会很慢。

    【讨论】:

    • 我在考虑类似 foos.Where(f => f.Date IsLatest) 之类的东西。我实际上是在尝试规范模式,我需要它是一个布尔表达式。
    • 是的,但这甚至不是 c#,所以它不会编译,我相信你也知道这一点。我也不相信以这种方式包装 EF 有什么真正的好处。您的 ObjectContext 类 'GetLatestFoo' 上的快捷方法肯定是最简单的方法吗?
    【解决方案4】:

    试试这个:

    DateTime maxDate = FooCollection.Max(f=>f.Date)
    

    【讨论】:

    • “获取最新日期的 Foo”,而不是“获取最新日期”
    【解决方案5】:

    你可以试试下面的代码:

    List<Foo> fooList = new List<Foo>();
    
    // add the Foo instance in list here
    // then apply following to take latest
    
    fooList.OrderByDescending(p => p.Date).Take(1);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-11
      • 2021-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-12
      • 2011-01-13
      相关资源
      最近更新 更多