C# 如何使用Linq获得每组的第一条记录
考虑到下列记录:C# 如何使用Linq获得每组的第一条记录,c#,linq,c#-4.0,linq-to-entities,C#,Linq,C# 4.0,Linq To Entities,考虑到下列记录: Id F1 F2 F3 ------------------------------------------------- 1 Nima 1990 10 2 Nima 1990 11 3 Nima 2000 12
Id F1 F2 F3
-------------------------------------------------
1 Nima 1990 10
2 Nima 1990 11
3 Nima 2000 12
4 John 2001 1
5 John 2002 2
6 Sara 2010 4
我想根据F1
字段分组,并按Id
排序,从组的第一条记录中获取与这些记录类似的所有字段:
Id F1 F2 F3
-------------------------------------------------
1 Nima 1990 10
4 John 2001 1
6 Sara 2010 4
如何使用linq实现这一点?@Alireza的awnser是完全正确的,但您必须注意,在使用此代码时
var result = input.GroupBy(x => x.F1, (key,g) => g.OrderBy(e => e.F2).First());
var res = from element in list
group element by element.F1
into groups
select groups.OrderBy(p => p.F2).First();
这与此代码类似,因为您对列表进行排序,然后进行分组,这样就得到了第一行组
var res = (from element in list)
.OrderBy(x => x.F2)
.GroupBy(x => x.F1)
.Select()
现在,如果你想做一些更复杂的事情,比如,得到相同的分组结果,但是得到F2的第一个元素和F3的最后一个元素,或者一些更自定义的事情,你可以通过研究下面的代码来完成
var res = (from element in list)
.GroupBy(x => x.F1)
.Select(y => new
{
F1 = y.FirstOrDefault().F1;
F2 = y.First().F2;
F3 = y.Last().F3;
});
所以你会得到类似的结果
F1 F2 F3
-----------------------------------
Nima 1990 12
John 2001 2
Sara 2010 4
用它来实现你想要的。然后决定要返回哪些属性
yourList.OrderBy(l => l.Id).GroupBy(l => new { GroupName = l.F1}).Select(r => r.Key.GroupName)
OrderBy()之后使用.AsEnumerable()这向我展示了使用流畅语法的方法。这似乎给了你很多力量-一个可以添加到学习的长长的列表@rogersillito这就是为什么它被称为查询(Language Integrated query-LINQ),GroupBy也有许多重载,但通常使用的只是少数重载,还取决于个人偏好,例如一些人更喜欢将其写成
.GroupBy(x=>x.F1)。选择(g=>…)
,它可能看起来更容易理解。您应该将.First()
替换为.FirstOrDefault()
,否则您将得到异常:方法“First”只能用作最终查询操作。考虑在这个实例中使用方法“FrestSturrest'”。我知道这一点,但是我假设LINQ在这里被用作LINQ to对象,而不是LINQ到实体,所以我们可以安全地使用<代码> .FiST()/<代码>。OP的问题看起来真的只是关心linq to object,尽管他也用linq to entities
标记了这个问题(不确定他是否理解这是什么)。我喜欢这个答案,很好。很高兴我找到了这个。我得到的错误消息“方法‘第一’只能用作最终的查询操作。请考虑在该实例中使用方法‘FrestSturrest'”。我在查询后对列表执行的唯一操作是将myResult.ToList()传递给一个方法。使用FirstOrDefault解决了这个问题,虽然它是OrderBy(p=>p.Id)
,他们希望它按ID排序,而不是按年份列。您能为此提供一些帮助吗:如果要从组中检索第一个和最后一个项目,该怎么办?新对象的分隔符或分隔符应该是逗号而不是分号。请检查。好的部分是.first()和.last(),可能是first()
part在EFCore 3.1中不受更多支持,您可能必须首先具体化数据。
yourList.OrderBy(l => l.Id).GroupBy(l => new { GroupName = l.F1}).Select(r => r.Key.GroupName)
var res = (from element in list)
.OrderBy(x => x.F2).AsEnumerable()
.GroupBy(x => x.F1)
.Select()