LINQ:理解并执行Groupby以带回独特的行?

时间:2009-11-09 13:32:25

标签: linq linq-to-sql group-by

我想在linq做一个groupby,基本上我有一个列表(沿着列表 - 大约1000个条目),我希望groupby描述。

参赛作品是车辆,因此有大约50辆福特蒙迪欧

我的查询非常简单,没有连接(但是:-))但是它带回了包含50辆福特蒙迪欧的列表,我希望它将它们分组,因此只有1个条目。

我只选择说明,我没有选择不同的ID,但在LinqPad中它返回desc,我可以看到50个福特mondeos,它们在描述中都是相同的 - 字母用于写信。

我做错了什么?

from v in dc.Vehicles
   group v by v.Description into g1
from y in g1
   orderby y.Description 
select new
{
     Desc = y.Description 
};

修改

它现在为每个福特蒙迪欧带回了1条记录,这是我的测试,以确保它的工作,但我需要扩展这一点,再次它应该只为福特蒙迪欧带回1记录,因为我已检查他们都有相同数量的门,分类,型号ID等。

from v in dc.Vehicles
  group v by v.Description into g1
orderby g1.Key
  select new
  {
     Desc = g1.Key,
     CategoryId = g1.CategoryId,
     MakeId = g1.MakeId,
     ModelId = g1.ModelId,
     Doors = g1.Doors,
  };

在上述课程不起作用的情况下,它找不到所有其他字段,即CategoryId ...我尝试将组分开,并为其他字段添加逗号。

我认为我对密钥有点混淆,我知道这是关键,但如果你在超过1个字段进行分组,那么你可能会有超过1个密钥..

有什么想法吗?

3 个答案:

答案 0 :(得分:4)

你正在使用导致问题的第二个“来自”。试试这个:

from v in dc.Vehicles
group v by v.Description into g1
orderby g1.Key
select new
{
     Desc = g1.Key
};

从概念上讲,这样的一个组由一个“序列序列”组成 - 每组一个子序列,所有项目都与该组匹配。每个子序列都有一个键 - 在这种情况下的描述。

你的“from”条款基本上是这样说的,“对于每个小组,让我得到小组中的所有元素” - 有效地再次对它们进行取消组合:)通常你会对小组进行某种聚合,例如:最后一部分:

select new
{
     Desc = g1.Key,
     Oldest = g1.Min(x => x.Date),
     Newest = g1.Max(x => x.Date)
};

编辑:要对多个字段进行分组,请使用匿名类型:

group v by new { v.Description, v.Doors, v.Model } into g1

然后该匿名类型将形成密钥。

要获取记录中的任何字段,您可以尝试:

选择新的    {        RandomField = g1.First()。RandomField,        Description = g1.Key,        //等    }

逻辑上接受子序列中的第一条记录。我不知道它是否适用于LINQ to SQL - 我知道它会在LINQ to Objects中,但我不知道SQL等价物是什么。即使它 工作,它也可能非常昂贵。我怀疑通过复合键(通过匿名类型)进行分组是这里的方法。

答案 1 :(得分:1)

如果您只想要按键(您分组的字段),则需要执行以下操作...

from v in dc.Vehicles
   group v by v.Description into g1
select g1.Key;

答案 2 :(得分:0)

group bys不用于获取唯一行,而是用于在有sum,avg,count等聚合表达式时对列进行分组。