2017-02-17 20 views
0

У меня есть quandry, который я пытаюсь решить с LINQ, но пока у меня нет рабочего решения.Запрос 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, поэтому кто-то, входящий в неправильный почтовый индекс, будет производить другую группу, например, или кто-то, кто отправит St Louis или Сент-Луис или Сент-Луис - все это разные группы.

Город, штат и адрес не имеют отношения к тому, как я хочу группироваться, но мне нужен доступ к этим данным, когда он был сгруппирован по BusinessName, Address1 и Address2. Как я могу достичь этого с помощью Linq?

+0

Не уверен, что вы спрашиваете. Ваша переменная 'g' перечислима, включая все исходные объекты, имеющие один и тот же групповой ключ. В настоящее время вы теряете их при выборе 'FirstOrDefault' каждой группы. –

ответ

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

Я включил счетчик, так что я мог видеть, сколько элементов были в каждой группе.

0

В то время как его немного больше работает, лучшей идеей было бы создать тип, содержащий только нужные вам поля, и создать новый экземпляр этого типа при выполнении начального запроса.

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

затем

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