LINQ查询返回按多个列分组的整个对象,当一个是不同的

时间:2017-02-17 17:11:17

标签: c# linq group-by distinct

我有一个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();

我已编写的代码可以正常运行,但问题是我丢失了我需要的所有其他数据。如果我将这些数据包含在新的{}对象中,那么它会增加差异,从而增加我不想搜索的组的数量。例如,我添加了City,State和Zipcode数据,但是对于我的意图,这是不相关的...数据并不总是正确的zipcodes所以输入错误的邮政编码的人会产生另一个组,例如,或者有人推出圣路易斯或圣路易斯或圣路易斯都将是不同的群体。

城市,州和地址与我想要分组的方式无关,但是一旦按照BusinessName,Address1和Address2分组,我就需要访问该数据。我怎样才能使用Linq实现这一目标?

2 个答案:

答案 0 :(得分:0)

我在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();

我加了一个计数,所以我可以看到每组中有多少项。

答案 1 :(得分:0)

虽然预先做了一些工作,但最好的想法是创建一个只包含所需字段的类型,并在执行初始查询时创建该类型的新实例。

fun

然后

public class MyBusiness
{
    public string BusinessName { get; set; }
    public string BusinessAddress1 { get; set; }
    public string BusinessAddress2 { get; set; }
}