2009-03-24 6 views
2

J'ai une table qui a zéro à plusieurs enfants. juste comme comment ce site a un QUESTION qui peut avoir zéro à beaucoup VOTES (soit Up == 1 ou Down == 0).Comment obtenir la somme dans cette requête Linq?

Je dois obtenir toutes les questions qui ont le plus de votes. Par exemple. toutes les questions, ordonnées par Somme (Vote) décroissant.

Je ne suis pas sûr de savoir comment le faire en linq.

Donc je voudrais avoir un EntitySet appelé Questions et un autre EntitySet appelé Votes.

Je tentais de faire un groupe et laisser l'ordre et rien ne compile :(

Quelqu'un pourrait-il des suggestions, s'il vous plaît

Répondre

3
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; 
+0

agréable et maigre. pouvez-vous aussi éditer ceci en utilisant (du format q dans myDataContext.Questions ...) aussi? (donc je peux apprendre comment le réduire, à votre syntaxe linq maigre s'il vous plaît?) –

2

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); 
} 
+0

belle réponse verbeux - amour comment u utilisé xml pour les données de test (?) . :) à votre santé! –

1

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 rassemble ici Count() est réellement ce que vous voulez? Somme() produirait le même, mais il est peut-être pas aussi meaningfull