为每个ID选择具有最大日期的值

Ale*_*mov 1 c# linq

这是表“历史”

id  value   date
1   1   01/01/2017 20:20:20
1   2   02/01/2017 20:20:20
1   3   03/01/2017 20:20:20
2   5   01/01/2017 20:20:20
2   6   02/01/2017 20:20:20
Run Code Online (Sandbox Code Playgroud)

如何使用linq为每个ID选择最大值

id  value   date
1   1   01/01/2017 20:20:20
1   2   02/01/2017 20:20:20
1   3   03/01/2017 20:20:20
2   5   01/01/2017 20:20:20
2   6   02/01/2017 20:20:20
Run Code Online (Sandbox Code Playgroud)

结果只有两个对象

id  value   date
1   3   03/01/2017 20:20:20
2   6   02/01/2017 20:20:20
Run Code Online (Sandbox Code Playgroud)

Bra*_*ner 7

如果希望整个行的日期都最高Id,则可以使用以下代码(用LinqPad编写)。如果只需要使用Id,则可以使用@BurnsBA的答案,因为这样做会稍微更有效。

void Main()
{
    var data = new List<Record>
    {
        new Record(){Id=1, Value=1, Date=new DateTime(2017,1,1)},
        new Record(){Id=1, Value=2, Date=new DateTime(2017,2,1)},
        new Record(){Id=1, Value=3, Date=new DateTime(2017,3,1)},
        new Record(){Id=2, Value=5, Date=new DateTime(2017,1,1)},
        new Record(){Id=2, Value=6, Date=new DateTime(2017,2,1)},
    };


    var query = data.GroupBy(d => d.Id)
                    .SelectMany(g => g.OrderByDescending(d => d.Date)
                                      .Take(1));
    query.Dump();
}

public class Record
{
    public int Id { get; set; }
    public int Value { get; set; }
    public DateTime Date { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

结果:

在此处输入图片说明

首先按进行分组Id,然后按Date降序对分组中的项目进行排序,然后返回第一个,SelectMany然后对列表进行展平。