我有一个看起来像这样的对象列表:
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();
答案 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();