我想在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个密钥..
有什么想法吗?
答案 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等聚合表达式时对列进行分组。