繁体   English   中英

LINQ 从每个查询中获取第一行

[英]LINQ Get First Rows from Each Query

我有两组数据和 ID,每个 ID 在数据集中有多个条目。 我想获取每个 ID 的最新条目。 我可以做data.Where(item => idList.Contains(item.ID)); 但这让我得到每一行,我每个 ID 只想要一个。 现在我正在考虑对每个 ID 进行迭代和单独查询,例如data.Where(item => item.ID == currentID).OrderBy(item => item.time).First(); ,但这看起来很笨拙。 在 LINQ 中是否有更优雅的方法来做到这一点?

给定 ID [1, 2, 3, 4] 和数据

time | ID | result
-------------------
1230 | 1  | Succeed
1215 | 1  | Fail
1215 | 2  | Fail
1200 | 2  | Fail
1220 | 3  | Fail
1215 | 4  | Success
1200 | 5  | Fail

我想得到

time | ID | result
-------------------
1230 | 1  | Succeed
1215 | 2  | Fail
1220 | 3  | Fail
1215 | 4  | Success

您可以按 id 分组并获取时间最长的元素:

var ids = new[]{1,2,3,4};
var l = new List<(int time,int id,string result)>(){
    (1230, 1, "Succeed"),
    (1215, 1, "Fail"),
    (1215, 2, "Fail"),
    (1200, 2, "Fail"),
    (1220, 3, "Fail"),
    (1215, 4, "Success"),
    (1200, 5, "Fail")
};

var results = l.Where(x => ids.Contains(x.id))
    .GroupBy(
        x => x.id,
        (k,v) => v.OrderByDescending(x=>x.time).First()
        );

这将导致

1230 1 Succeed 
1215 2 Fail 
1220 3 Fail 
1215 4 Success 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM