获取LINQ中组的第一条记录?

时间:2010-10-03 15:43:29

标签: c# entity-framework linq c#-4.0 linq-to-entities

摘要:如何获取有序数据组中的前1个元素

我正在尝试按CarId字段进行分组,然后在每个组中,我想对DateTimeStamp字段进行降序排序。所需的数据将是每辆车给我最新的DateTimeStamp,只有组中的那个。

我可以达到这一点,但是在通过DateTimeStamp desc从组中排名前1并排序组时遇到问题。

以下是我在第一组操作后的

group 1
------------------------
CarId  DateTimeStamp 
1      1/1/2010
1      1/3/2010
1      3/4/2010

group 2
------------------------
CarId  DateTimeStamp 
2      10/1/2009
2      1/3/2010
2      9/4/2010

我希望只有订购组中的前1名

    group 1
    ------------------------
    CarId  DateTimeStamp 
    1      3/4/2010

    group 2
    ------------------------
    CarId  DateTimeStamp 
    2      9/4/2010

Brickwall:我停止的地方,需要group by子句中的CarId和DateTimeStamp,以便稍后按DateTimeStamp排序。也许日期的排序应该在一个单独的函数中完成,不确定。

2 个答案:

答案 0 :(得分:17)

data
    .GroupBy(
        x => x.CardId, 
        (x, y) => new { 
            Key = x, 
            Value = y.OrderByDescending(z => z.DateTimeStamp).FirstOrDefault() 
        }
    );

这将按CardId对所有元素进行分组,然后按DateTimeStamp(降序)对每个组的元素进行排序,然后将每个组削减为仅包含第一个元素。最后,它会返回一个可忽略的“组”(带有恐慌引号,因为它们实际上是一个匿名类型而不是IGrouping),其中每个组都有您正在寻找的一个项目。

答案 1 :(得分:2)

我发现自己更容易理解查询表达式语法:

from x in data 
group x by x.CarId into grp
select new {
    CarId = x.CarId,
    Record = (from x in grp orderby z.DateTimeStamp descending).FirstOrDefault()
};