Linq查询按多列分组但获取其他属性

时间:2015-11-11 15:01:37

标签: c# linq group-by

我有一张包含许多重复记录的表格。如何使用C#Linq查询按多个字段进行分组,还可以获取不同记录的ID。

例如:我有一个看起来像这样的商店表

Store
-----
ID, StoreName, Address1

1, CVS, 123 Main Street
2, CVS, 123 Main Street
3, CVS, 456 Main Street

我希望按storeName分组,然后按地址1分组,还要获取第一个不同(storeName和address1)记录的ID。

我只想要这两个记录:

1, CVS, 123 Main Street
3, CVS, 456 Main Street

我尝试使用匿名对象但无法弄清楚如何获取ID而不按ID进行分组。

3 个答案:

答案 0 :(得分:3)

当您在LINQ中使用GroupBy时,您将获得一个实现接口IGrouping<TKey,TElement>的类的可枚举 - 表示已分组的个体和原始元素的TElement

因此你会这样分组

 var grouped = myList.GroupBy(x => new {x.StoreName,x.Address1});

这会给你一个IGrouping<anonymous,Store>的可枚举列表(假设原始对象被称为Store)。 anonymous是一个匿名对象,包含2个属性StoreNameAddress1

现在,可枚举中的每个项目都是{em>本身可枚举的Store,您可以像处理其他任何可枚举项一样对待 - 您可以使用First().ID if你希望,如果那就是你想要的那样,你可以将整个项目投射到一个可枚举的

var result = myList.GroupBy(x => new {x.StoreName,x.Address1});
                   .Select(g => new {
                                  g.Key.StoreName, 
                                  g.Key.Address1, 
                                  FirstID = g.First().ID
                                });

答案 1 :(得分:1)

这样的事情应该有效。您必须在不属于分组的字段上应用聚合:

var result = list.GroupBy(c => new { c.StoreName, c.Address1 }).
                  Select(c => new
                  {
                      ID = c.Min(i => i.ID),
                      c.Key.StoreName,
                      c.Key.Address1
                  }).ToList();

答案 2 :(得分:0)

这是一些未经测试的伪代码,但你想要这样的东西

storeList.GroupBy(s => new { s.Storename, s.Address1})
         .SelectMany(g => g.First())
         .ToList()