¿Cómo puedo obtener la Suma en esta consulta LINQ?
Pregunta
Tengo una tabla que tiene cero a muchos niños. al igual que cómo este sitio tiene un QUESTION
que puede tener de cero a muchos VOTES
(ya sea hacia arriba o hacia abajo == 1 == 0).
Necesito conseguir todas las preguntas que tienen el mayor número de votos positivos . P.ej. todas las preguntas, ordenadas por Sum (Voto) descendente.
No estoy seguro de cómo hacerlo en LINQ.
Así que me gustaría tener una llama EntitySet Preguntas y otro EntitySet llamada Votos.
Yo estaba tratando de hacer grupo y dejar que el orden y nada compila: (
Podría alguien tiene alguna sugerencia, por favor?
Solución
myDataContext.Questions
.OrderByDescending(q => q.Votes.Select(v => v.VoteValue).Sum())
En la comprensión de consulta (sin marcar):
from q in myDataContext.Questions
order q by
(
from v in q.Votes
select v.VoteValue
).Sum() descending
select q;
Otros consejos
Esto depende principalmente de sus datos, pero aquí es una pequeña muestra:
XElement xdoc=XElement.Parse(@"
<root>
<question name=""A"">
<vote type=""up"" />
<vote type=""down"" />
</question>
<question name=""B"">
<vote type=""up"" />
<vote type=""up"" />
</question>
<question name=""C"" />
</root>
");
var result=
from q in xdoc.Elements("question")
let votes=q.Elements("vote").Count(v=>v.Attribute("type").Value=="up")
orderby votes descending
select new
{
Name=q.Attribute("name").Value,
Votes=votes
};
foreach (var r in result)
{
Console.WriteLine(r.Name+" "+r.Votes);
}
Desde que está utilizando EntitySet Deduzco que es Linq2SQL? Asumiendo que tiene referencias establecidas correctamente y tener una propiedad Vote.Question:
(from v in dc.Votes
where v.IsUpVote // v.Vote == 1 (??)
group v by v.Question into q
select new { Question = q.Key, UpVotes = q.Count() }).OrderByDescending(e => e.UpVotes);
Tengo entendido aquí count () es en realidad lo que quiere? Sum () produciría el mismo, pero es quizás no tan meaningfull (?)