2013-04-25 2 views
0

У меня есть объект с родительского класса и два класса ребенка, как это:значения суммы в дочерней сущности

Налоговый отчет -> Parcel -> мытарь

Налоговый отчет содержит коллекцию Посылка и парцелла содержат коллекцию сборщика налогов.

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

TaxReport: 1

посылок: 0001
мытарь: Даллас Каунти, $ 100 в виде налогов за
мытарь: Collin County, $ 50 в виде налогов за

посылок: 0002
мытарь: Collin County, $ 1000 в виде налогов за
мытарь: Город Ирвинг, $ 100 в виде налогов за

Я хочу запросить мои объекты, чтобы суммировать налоги, причитающиеся за все посылки, сгруппированные сборщиком налогов. Вот что я хочу, чтобы мой результат выглядеть следующим образом:

округ Даллас, $ 100
Collin County, город $ 1050
Ирвинга, $ 100

Я пытался что-то вдоль этих линий: уага taxsummary = от тра в taxreport.Parcel.Select (y => y.TaxCollector) .Выберите (n => n.TaxesDue) .Sum()

Но мне не повезло. Мои результаты всегда прогнозируются как многоуровневая коллекция с налогами, подлежащими оплате ниже каждой посылки, не сгруппированной сборщиком налогов. Есть идеи?

Спасибо, Брэд

+0

пришлось удалить мой первый подход. Будут писать что-то более интеллектуальное в немного. – CSharpie

+0

Повторите попытку сейчас. – CSharpie

ответ

0

Это делает трюк:

var grouped = from parcel in taxReport.Parcels 
       from taxCollector in parcel.TaxCollectors 
       group taxCollector by new 
       { 
        Name = taxCollector.Name // Or whatever makes it Unique... 
       }; 

foreach(var collectorGroup in grouped) 
{ 
    Console.WriteLine(collectorGroup.Key.Name + " : " + collectorGroup .Sum(p => p.TaxesDue)); 
} 

Если вы хотите что-то вроде словаря вы можете сделать это:

var grouped = (from parcel in taxReport.Parcels 
       from taxCollector in parcel.TaxCollectors 
       group taxCollector by new 
       { 
        Name = taxCollector.Name 
       } 
       into groupedCollectors 
       select new 
       { 
        Name = groupedCollectors.Key.Name, 
        TaxesDue = groupedCollectors.Sum(p => p.TaxesDue) 
       }) 
       .ToDictionary(p =>p.Name, p => p.TaxesDue); 
+0

Отлично! Работает как шарм! Я два дня бил головой по столу. Я не понимаю, что делает .ToDictionary(), но он работает! Ваше второе решение - именно то, что мне нужно. Еще раз спасибо! –

+0

ToDictionary требует двух параметров. Первая - это функция, которая возвращает ключи, вторая дает нам значения. Я не знаю, как это работает внутри, но я убеждаю, что он повторяет все предметы, а затем выполняет первую лямбду для ключа, затем вторую для значения. В основном он отображает каждый элемент из запроса, беря каждый элемент ключа и каждый элемент TaxesDue. – CSharpie

+0

Это дает мне результаты, которые я хочу без части .ToDictionary(), поэтому я думаю, что я оставлю эту часть и перейду на группу groupCollectors –