2011-10-21 19 views
5

Przepraszam za okropny tytuł, nie byłem pewien, jak sformułować mój problem.Grupowanie danych LINQ Dwukrotnie

Mam obiekt, który wygląda tak:

CustAcct cust = new CustAcct(); 
cust.Name = "John Doe"; 
cust.Account = "ABC123"; 
cust.OrderTotal = 123.43 
cust.OrderQty = 4; 
cust.TransDate = "12/26/2010 13:00" 

proszę nie spędzają zbyt wiele czasu krytykuje kolejną część, bo to naprawdę nie ma do czynienia z zakupów koszyka/rzeczy klienta, ale idea jest tak samo, po prostu chciałem użyć czegoś, z czym wszyscy są dobrze obeznani.

Konto może mieć więcej niż jednego klienta, a klient może mieć więcej niż jedno konto.

Więc trzeba:

List<CustAcct> custList = new List<CustAcct>(); 
custList.Add("John Doe", "ABC123", 123.43, 4, "12/26/2010 13:00"); 
custList.Add("John Doe", "ABC123", 32.12, 2, "12/27/2010 10:00"); 
custList.Add("John Doe", "ABC321", 43.34, 1, "12/28/2010 15:00"); 
custList.Add("John Doe", "ABC321", 54.60, 3, "12/28/2010 16:00"); 
custList.Add("Jane Zoe", "ABC123", 46.45, 2, "12/28/2010 17:00"); 
custList.Add("Jane Zoe", "ABC123", 32.65, 1, "12/29/2010 12:00"); 
custList.Add("Jane Zoe", "ABC321", 67.65, 3, "12/29/2010 23:00"); 
custList.Add("Jane Zoe", "ABC321", 75.34, 4, "12/30/2010 08:00"); 

Co chciałbym zrobić, to suma wszystkich OrderTotal i OrderQty dla każdego konta i Klientem więc moje wyjście będzie wyglądać następująco:

Account Customer OrderTotal OrderQty 
ABC123  John Doe 155.55   6 
ABC321  John Doe  97.94   4 
ABC123  Jane Zoe  79.10   3 
ABC321  Jane Zoe 142.99   7 

I Przeszedłem przez moją książkę LINQ to Objects i 101 LINQ Samples i nie mogę wymyślić, jak to zrobić. Dzięki.

+0

Czy używasz składni metody lub składni zapytania? –

+0

Używam składni zapytania. z c w CustList ... – Stephen

+0

Czy chcesz pogrupować według kombinacji konta/klienta? Lub po prostu pogrupować według klientów, a następnie według konta? Subtelna różnica, ale wpływa na moją odpowiedź ... –

Odpowiedz

9

Można grupa a suma tak:

from ca in custList 
group ca by new { ca.Name, ca.Account } into g 
select new { 
    g.Key.Account, 
    g.Key.Name, 
    OrderTotal = g.Sum(o => o.OrderTotal), 
    OrderQty = g.Sum(o => o.OrderQty) 
}; 

See it in action.

+0

Dziękuję. To działało idealnie. – Stephen