Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用Linq获得每组的第一条记录_C#_Linq_C# 4.0_Linq To Entities - Fatal编程技术网

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()