2012-06-06 9 views
17

estoy usando el siguiente LINQ para seleccionar datos de una tabla:marco de la entidad donde, el orden y el grupo

(from m in entity.Results 
where m.Group == 0 || 
m.Group == 1 
orderby m.Points descending 
select m); 

Esto me da un resultado de todos los usuarios que están en el Grupo 1 o 2. Con ese i puede mostrar los puntos que tienen. Pero esto me muestra los puntos que tienen en el Grupo 1 y el Grupo 2 por separado.

¿Cómo puedo agruparlos y mostrar el total de puntos que tienen? Así que en lugar de esto (lo que tengo ahora):

user1 - group1 - 10 
user1 - group2 - 7 
user2 - group1 - 7 
user2 - group2 - 5 

quiero esto:

user1 - total: 17 
user2 - total: 12 

¿Cómo tengo que ajustar mi consulta para obtener un conjunto de resultados de ese modo?

Respuesta

17

necesita agrupar los usuarios, a continuación, utilizar Sum para calcular el TotalPoints: Salida

from m in entity.Results 
where m.Group == 0 || m.Group == 1 
group m by m.User into g 
let TotalPoints = g.Sum(m => m.Points) 
orderby TotalPoints descending 
select new { User = g.Key, Username = g.Key.Username, TotalPoints }; 
+0

Esto parece estar funcionando. Pero también me gustaría incluir el nombre de usuario en los resultados. Entonces en la parte ** select new {...} ** traté de agregar esto --- g.Primero(). User.Username. Pero esto no parece estar funcionando. ¿Alguna idea de cómo puedo incluir el nombre de usuario también? – Vivendi

+1

@Vivendi Ya seleccionó el 'Usuario', no necesita cambiar la consulta. O puede hacer esto 'seleccione nuevo {Usuario = g.clave, Nombre de usuario = g.clave.nombre de usuario, TotalPuntos}; –

12
entity.Results 
     .Where(m => m.Group == 0 || m.Group == 1) 
     .GroupBy(m => m.UserID) 
     .Select(m => new { User = m.Key, TotalPoints = m.Sum(v => v.Points) }) 
     .OrderByDescending(m => m.TotalPoints); 
+0

Muchas gracias. Me ayudó. –

1

uso Hola Vivendi esto (Por favor, editar según su requisito)

var q = (from h in entity.Results 
group h by new { h.UserID} into hh 
select new { 
    hh.Key.UserID, 
    Score = hh.Sum(s => s.Points) 
}).OrderByDescending(i => i.Points); 

en total: 17

en total: 12

-1

Otro ejemplo más de una suma y una unión

from e in _context.LearnResults 
join c in _context.Country on e.CountryId equals c.CountryId 
where c.DomainId.Equals("xx") 
group e by e.Country.Name into newCountry 
let Approved = newCountry.Sum(e => e.Approved) 
let Total = newCountry.Sum(e => e.Total) 
select new LearnResults() { CountryName = newCountry.Key, Approved= Approved, Total=Total }; 
Cuestiones relacionadas