我有一张包含许多重复记录的表格。如何使用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进行分组。
答案 0 :(得分:3)
当您在LINQ中使用GroupBy
时,您将获得一个实现接口IGrouping<TKey,TElement>
的类的可枚举 - 表示已分组的个体和原始元素的TElement
。
因此你会这样分组
var grouped = myList.GroupBy(x => new {x.StoreName,x.Address1});
这会给你一个IGrouping<anonymous,Store>
的可枚举列表(假设原始对象被称为Store
)。 anonymous
是一个匿名对象,包含2个属性StoreName
和Address1
。
现在,可枚举中的每个项目都是{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()