开发者

Get the first record of a group in LINQ? [duplicate]

开发者 https://www.devze.com 2023-01-19 00:47 出处:网络
This question already has answers here: How to get first record in each group using Linq (7 answers) Closed 5 years ago.
This question already has answers here: How to get first record in each group using Linq (7 answers) Closed 5 years ago.

Summary: How to get top 1 element in ordered groups of data

I am trying to group by a CarId field , and then within each group, I want to sort on a DateTimeStamp field descending. The desired data would be for each Car give me the latest DateTimeStamp and only that 1 in the group.

I can get to this point, but having problems taking the top 1 off of the group and ordering the group by DateTimeStamp desc.

Here is what I have after the first group operation:

group 1
-----------------开发者_Python百科-------
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

what I would desire only the top 1 in an ordered group

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

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

Brickwall: Where I get stopped, is needing the CarId and DateTimeStamp in the group by clause, in order to later sort by the DateTimeStamp. Maybe the sorting of the date should be done in a separate function, not sure.


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

This will group all the elements by CardId, then order the elements of each group by DateTimeStamp (descending), then pare down each group to only contain the first element. Finally, it returns an enumerable of "groups" (with the scare quotes since they're actually an anonymous type instead of an IGrouping) where each group has the one item you're seeking.


I find the query expression syntax easier to understand myself:

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()
};
0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号