首页 > 解决方案 > 使用 Linq 为每个 ID 选择具有最大日期的所有对象

问题描述

我有这张桌子:

Sn    Value      Data     
150   180.3    01/06/2020  
150   195.0    01/05/2020  
149   13.3     01/06/2020  
345   27.5     27/06/2013
....  

我需要为每个“Sn”选择所有具有最大数据的对象。那就是我需要这样的结果:

Sn    Value      Data     
150   180.3    01/06/2020  
149   13.3     01/06/2020  
345   27.5     27/06/2013
...

我试过这个查询:

var obj = db.myTable.AsEnumerable()
.GroupBy(g => g.Sn)
.Select(g => g.OrderByDescending(x => x.Date)).FirstOrDefault();

using(StreamWriter sw = new StreamWriter("data.txt", true , System.Text.Encoding.Default)){
   foreach(var x in obj){
      sw.WriteLine($"{x.Sn} {x.Date} {x.Value}");
   }
}

但我只得到“Sn”= 150 的对象

我依赖 SQL,这个查询看起来像这样:

SELECT t.Sn, r.Data FROM (
SELECT Sn, MAX(data) as Date FROM MyTable GROUP BY Sn
) r
INNER JOIN myTable t
ON t.Sn = r.SN AND t.date = r.Data

但我不确定它是否正确,而且我没有足够的知识在 linq 上写它

标签: c#linq

解决方案


.FirstOrDefault的应用在错误的地方,外面Select。但是你需要有每个组的第一个元素,而不是

.Select(g => g.OrderByDescending(x => x.Date))
.FirstOrDefault();

你需要

.Select(
     g => g.OrderByDescending(x => x.Date)
           .FirstOrDefault()
);

唯一细微的区别是放置,)但我格式化了代码以获得更好的可读性。


推荐阅读