Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# LINQ查询返回由多列分组的整个对象,其中一列是不同的_C#_Linq_Group By_Distinct - Fatal编程技术网

C# LINQ查询返回由多列分组的整个对象,其中一列是不同的

C# LINQ查询返回由多列分组的整个对象,其中一列是不同的,c#,linq,group-by,distinct,C#,Linq,Group By,Distinct,我有一个quandry,我正试图用LINQ解决,但我还没有一个有效的解决方案 我有一个包含大量数据的企业列表。我需要保留所有这些数据,以便在对其进行分组和消除某些重复数据时能够访问这些数据 所以我感兴趣的分组的主要属性是Address1、Address2和BusinessName 我想先按企业名称分组,然后按地址1分组,然后按地址2分组,但仅当地址2不同时。这样做的原因是,我可能有多种方式来书写相同的地址,通常这与地址2的书写方式不同有关,这很好,我们现在将支持这一点,如果将其写成Suite 2

我有一个quandry,我正试图用LINQ解决,但我还没有一个有效的解决方案

我有一个包含大量数据的企业列表。我需要保留所有这些数据,以便在对其进行分组和消除某些重复数据时能够访问这些数据

所以我感兴趣的分组的主要属性是Address1、Address2和BusinessName

我想先按企业名称分组,然后按地址1分组,然后按地址2分组,但仅当地址2不同时。这样做的原因是,我可能有多种方式来书写相同的地址,通常这与地址2的书写方式不同有关,这很好,我们现在将支持这一点,如果将其写成Suite 200或Ste 200,则将以不同的方式处理。这是为了确保我们不会消除多个办公室位于同一建筑中的实际差异(即Ste 200和Ste 100都是不同办公室的同一业务)。但是,我不想返回具有相同地址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();