Comment puis-je obtenir la somme dans cette requête Linq?
Question
J'ai une table qui a beaucoup d'enfants de zéro. tout comme la façon dont ce site a un qui peut avoir QUESTION
zéro à plusieurs VOTES
(vers le haut == 1 == 0 ou vers le bas).
Je dois obtenir toutes les questions qui ont le plus des votes . Par exemple. toutes les questions, classés par ordre Somme (Vote) descendant.
Je ne sais pas comment le faire dans LINQ.
Alors j'aurais un EntitySet appelé Questions et un autre EntitySet appelé Votes.
Je suis en train de faire un groupe et laisser l'ordre et rien ne compile: (
Quelqu'un pourrait-il des suggestions, s'il vous plaît?
La solution
myDataContext.Questions
.OrderByDescending(q => q.Votes.Select(v => v.VoteValue).Sum())
Dans la compréhension de la requête (non cochée):
from q in myDataContext.Questions
order q by
(
from v in q.Votes
select v.VoteValue
).Sum() descending
select q;
Autres conseils
Cela dépend surtout de vos données, mais voici un petit échantillon:
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);
}
Puisque vous utilisez EntitySet je crois qu'il est Linq2SQL? En supposant que vous avez des références établies correctement et ont une propriété 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);
Je crois ici COUNT () est en fait ce que vous voulez? Somme () produirait le même, mais il est peut-être pas aussi meaningfull (?)