c# - 使用 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 上写它
解决方案
你.FirstOrDefault
的应用在错误的地方,外面Select
。但是你需要有每个组的第一个元素,而不是
.Select(g => g.OrderByDescending(x => x.Date))
.FirstOrDefault();
你需要
.Select(
g => g.OrderByDescending(x => x.Date)
.FirstOrDefault()
);
唯一细微的区别是放置,)
但我格式化了代码以获得更好的可读性。
推荐阅读
- assembly - 图形重复,程序集引导加载程序
- node.js - 从 nodejs 函数返回一个 zip 文件
- excel - Excel:检查两个值是否在两个其他值之间
- c# - 使用 MySQL 的 Code First 不会创建表
- html - Ionic 2:我被拒绝了,因为“我的应用程序中的 YouTube 视频在按下电源按钮后继续播放”
- python - Python/Json - 如何从禁止的 json url 中抓取
- r - R + Plot.ly + add_trace
- git - 推入github
- mysql - 3 表连接计数空值
- java - 如何修改Spring MVC项目的包名?