2011-10-21 20 views
5

Disculpas por el título terrible, no estaba muy seguro de cómo expresar mi problema.LINQ agrupando datos dos veces

Tengo un objeto que se parece a:

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" 

por favor no pasan demasiado tiempo criticando la siguiente parte porque esto realmente no se trata de un carrito de la compra/Cliente cosas, pero la idea es la lo mismo, solo quería usar algo con lo que todo el mundo esté bastante familiarizado.

Una cuenta puede tener más de un cliente y un cliente puede tener más de una cuenta.

Por lo que tiene:

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

Lo que me gustaría hacer es obtener la suma de todos OrderTotal y OrderQty para cada cuenta y cliente por lo que mi salida se verá así:

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 He pasado por mi libro LINQ to Objects y 101 muestras LINQ y no puedo entender cómo conseguir esto. Gracias.

+0

¿Está utilizando la sintaxis del método o la sintaxis de la consulta? –

+0

Estoy usando la sintaxis de la consulta. de c en CustList ... – Stephen

+0

¿Desea agrupar por el combo cuenta/cliente? ¿O solo grupo por cliente, luego por cuenta? Diferencia sutil, pero afecta mi respuesta ... –

Respuesta

9

Puede agrupar y la suma de esta manera:

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

Gracias. Eso funcionó perfectamente. – Stephen