C# LINQ查询返回由多列分组的整个对象,其中一列是不同的
我有一个quandry,我正试图用LINQ解决,但我还没有一个有效的解决方案 我有一个包含大量数据的企业列表。我需要保留所有这些数据,以便在对其进行分组和消除某些重复数据时能够访问这些数据 所以我感兴趣的分组的主要属性是Address1、Address2和BusinessName 我想先按企业名称分组,然后按地址1分组,然后按地址2分组,但仅当地址2不同时。这样做的原因是,我可能有多种方式来书写相同的地址,通常这与地址2的书写方式不同有关,这很好,我们现在将支持这一点,如果将其写成Suite 200或Ste 200,则将以不同的方式处理。这是为了确保我们不会消除多个办公室位于同一建筑中的实际差异(即Ste 200和Ste 100都是不同办公室的同一业务)。但是,我不想返回具有相同地址2列表的相同地址C# LINQ查询返回由多列分组的整个对象,其中一列是不同的,c#,linq,group-by,distinct,C#,Linq,Group By,Distinct,我有一个quandry,我正试图用LINQ解决,但我还没有一个有效的解决方案 我有一个包含大量数据的企业列表。我需要保留所有这些数据,以便在对其进行分组和消除某些重复数据时能够访问这些数据 所以我感兴趣的分组的主要属性是Address1、Address2和BusinessName 我想先按企业名称分组,然后按地址1分组,然后按地址2分组,但仅当地址2不同时。这样做的原因是,我可能有多种方式来书写相同的地址,通常这与地址2的书写方式不同有关,这很好,我们现在将支持这一点,如果将其写成Suite 2
var myNonDupOfficeList = officeList
.GroupBy(o => new { o.Address1, o.Address2, o.BusinessName})
.OrderBy(g => g.Key.BusinessName).ThenBy(g => g.Key.Address1).ThenBy(g => g.Key.Address2)
.Select(o => o.FirstOrDefault()).ToList();
我已经编写的代码可以很好地做到这一点,但问题是我丢失了我需要的所有其他数据。如果我在新的{}对象中包含该数据,那么它会添加差异,从而增加我不想搜索的组的数量。例如,我添加了城市、州和Zipcode数据,但出于我的意图,这并不相关……zipcodes的数据并不总是正确的,因此输入错误Zipcode的人将生成另一个组,例如,输入圣路易斯、圣路易斯或圣路易斯的人都将是不同的组
城市、州和地址与我希望分组的方式无关,但一旦按BusinessName、Address1和Address2对数据进行分组,我就需要访问这些数据。如何使用Linq实现这一点?我在LinqPad中对Northwind数据库进行了尝试,我认为它可以满足您的需求-
Customers
.GroupBy(i => new { i.Country, i.City})
.OrderBy(i => i.Key.City)
.ThenBy(i => i.Key.Country)
.Select(i => new { Row = i.FirstOrDefault(), Cnt = i.Count()})
.Dump();
我加入了一个计数,这样我可以看到每个组中有多少项。虽然前面的工作稍微多一些,但最好是创建一个仅包含所需字段的类型,并在执行初始查询时创建该类型的新实例
public class MyBusiness
{
public string BusinessName { get; set; }
public string BusinessAddress1 { get; set; }
public string BusinessAddress2 { get; set; }
}
然后
不知道你在问什么。
g
变量可枚举,其中包含共享同一组密钥的所有原始对象。当前,在选择每组的FirstOrDefault
时,您将失去它们。
var myNonDupOfficeList = officeList
.GroupBy(o => new { o.Address1, o.Address2, o.BusinessName })
.OrderBy(g => g.Key.BusinessName).ThenBy(g => g.Key.Address1).ThenBy(g => g.Key.Address2)
.Select(o => new MyBusiness
{
BusinessName = o.BusinessName,
BusinessAddress1 = o.Address1,
BusinessAddress2 = o.Address2
}).ToList();