【问题标题】:max date record in LINQLINQ 中的最大日期记录
【发布时间】:2012-02-04 18:11:54
【问题描述】:

我在 MS Sql Server 中有一个名为 sample 的表,其中包含这些值:

 ID    Date    Description
1    2012/01/02 5:12:43    Desc1
2    2012/01/02 5:12:48    Desc2
3    2012/01/03 5:12:41    Desc3
4    2012/01/03 5:12:43    Desc4

现在我想编写 LINQ 查询,结果如下:

4    2012/01/03 5:12:43    Desc4

我写了这个,但它不起作用:

List<Sample> q = (from n in  Sample.Max(T=>T.Date)).ToList();

【问题讨论】:

  • 你的select在哪里?
  • 不起作用 -- 请详细说明。
  • @GertArnold - OP 在 9 年内没有任何活动。
  • @Enigmativity 我知道,无论如何我都会留下这样的 cmets,以表明一般不应该这样问问题。

标签: c# .net sql-server linq max


【解决方案1】:

.NET 6开始MaxByLINQ方法可用。

var result = items.MaxBy(i => i.Date);

.NET 6 之前:

O(n log n):

var result = items.OrderByDescending(i => i.Date).First();

O(n) – 但迭代序列两次:

var max = items.Max(i => i.Date);
var result = items.First(i => i.Date == max);

或者你可以使用MoreLINQ,它的MaxBy方法是O(n)

【讨论】:

  • 请注意,EF Core (link) 不支持 MaxBy
【解决方案2】:

要按日期获得最大的Sample 不必排序(这并不是真正需要获得最大值):

var maxSample  = Samples.Where(s => s.Date == Samples.Max(x => x.Date))
                        .FirstOrDefault();

【讨论】:

  • 据我了解,这与需要订购的公认答案具有相同的复杂性
  • @knocte 不,复杂度不一样 - 这是 O(n) - 需要 2 次通过,每次 O(n) - 排序将是 O(n log n) 所以更昂贵
  • 好酷,可以写成只有 1 次通过的方式吗?使用 LINQ 的重点是命令式代码更少,但性能相同或更好
  • 是的 - 它绝对可以用一个老派的foreach 循环一次完成,只需要保持Sample 实例在那个日期之前的最大日期。
  • 这在我看来是O(n^2)。在 where 子句的每次迭代中都会重新计算最大值。
【解决方案3】:
var lastInstDate = model.Max(i=>i.ScheduleDate);

我们可以像这样从模型中获取最大日期。

【讨论】:

  • 不知道为什么没有更多的投票。迄今为止最简单、最高效的
  • @FrankCastle616 它实际上并没有回答这个问题。这将返回一个日期,而不是包含该日期的记录
【解决方案4】:
List<Sample> q = Sample.OrderByDescending(T=>T.Date).Take(1).ToList();

但我想你想要

Sample q = Sample.OrderByDescending(T=>T.Date).FirstOrDefault();

【讨论】:

    【解决方案5】:

    这是一个单通道选项:

    var maxSample =
        Samples
            .Aggregate((x, y) => x.Date < y.Date ? y : x);
    

    【讨论】:

      【解决方案6】:
      IList<Student> studentList = new List<Student>() { 
          new Student() { StudentID = 1, StudentName = "John", Age = 18 } ,
          new Student() { StudentID = 2, StudentName = "Steve",  Age = 15 } ,
          new Student() { StudentID = 3, StudentName = "Bill",  Age = 25 } ,
          new Student() { StudentID = 4, StudentName = "Ram" , Age = 20 } ,
          new Student() { StudentID = 5, StudentName = "Ron" , Age = 19 } 
      };
      
      var orderByDescendingResult = from s in studentList
                         orderby s.StudentName descending
                         select s;
      

      结果: 史蒂夫 罗恩 内存 约翰 比尔

      【讨论】:

      • 这与接受的答案完全相同。
      【解决方案7】:
      var result= Sample.OrderByDescending(k => k.ID).FirstOrDefault().Date;
      

      这是最好的方法

      【讨论】:

      • 这与接受的答案完全相同。
      猜你喜欢
      • 1970-01-01
      • 2012-02-12
      • 2019-09-27
      • 1970-01-01
      • 2012-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多