Linq选择具有唯一ID和最大日期的对象?

时间:2018-10-04 16:38:29

标签: c# .net linq

我有一个看起来像这样的对象列表:

public class A
{
    public int Id {get; set;}
    public DateTime Date {get;set;}
    public int TypeId {get; set;}
    public int Version {get; set;}
}

我的数据如下:

 Id    Date     TypeId   Version
 1     10/3/18    1        1
 2     10/3/18    1        2
 3     10/4/18    1        1
 4     10/4/18    2        1

如何进行linq查询以将这2个返回到列表中,从而获取日期中日期最大的项目(版本号为1),并使用TypeId返回更多项目?

 Id    Date     TypeId   Version
 3     10/4/18    1        1
 4     10/4/18    2        1

这是我尝试过的方法,但是由于我的FirstOrDefault函数,我的代码仅返回一项。

        var q = from n in A.All.Where(x => x.Version == 1)
                group n by n.TypeId into g
                select g.OrderByDescending(t => t.Date).FirstOrDefault();

1 个答案:

答案 0 :(得分:2)

您需要按typeId分组,然后在每个分组中按日期对元素进行排序。然后,您可以在每个组中选择第一个元素。尝试以下代码:

var input = new[]
{
    new A {Id = 1, Date = new DateTime(2018, 10, 3), TypeId = 1, Version = 1},
    new A {Id = 2, Date = new DateTime(2018, 10, 3), TypeId = 1, Version = 2},
    new A {Id = 3, Date = new DateTime(2018, 10, 4), TypeId = 1, Version = 1},
    new A {Id = 4, Date = new DateTime(2018, 10, 4), TypeId = 2, Version = 1},
};

var result = input.Where(a => a.Version == 1)
    .GroupBy(a => a.TypeId)
    .Select(g => g.OrderByDescending(x => x.Date).First())
    .ToArray();