Pergunta

Eu tenho uma tabela que tem zero a muitas crianças. da mesma forma como este site tem um QUESTION que pode ter zero a muitos VOTES (tanto para cima == 1 ou para baixo == 0).

Eu preciso todas as questões que têm as mais votos . Por exemplo. todas as perguntas, ordenados por Sum (Vote) descendente.

Eu não tenho certeza de como fazê-lo em LINQ.

Para que gostaria de ter um EntitySet chamado Perguntas e outra EntitySet chamado Votos.

Eu estava tentando fazer grupo e deixar e da ordem e nada compila: (

Qualquer um poderia ter alguma sugestão, por favor?

Foi útil?

Solução

myDataContext.Questions
  .OrderByDescending(q => q.Votes.Select(v => v.VoteValue).Sum())

Em consulta compreensão (desmarcado):

from q in myDataContext.Questions
order q by 
(
  from v in q.Votes
  select v.VoteValue
).Sum() descending
select q;

Outras dicas

Isso depende em grande parte de seus dados, mas aqui está uma pequena amostra:

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

Uma vez que você estiver usando EntitySet Deduzo que é Linq2SQL? Supondo que você tenha referências configurado corretamente e tem uma propriedade 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);

I se reúnem aqui Count () é realmente o que você quer? Sum () iria produzir o mesmo, mas talvez não seja tão meaningfull (?)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top