代码之家  ›  专栏  ›  技术社区  ›  Pure.Krome

如何在这个LINQ查询中获取总和?

  •  2
  • Pure.Krome  · 技术社区  · 15 年前

    我有一张没有孩子的桌子。就像这个网站 QUESTION 可以有零对多 VOTES (向上==1或向下==0)。

    我需要得到 所有投票最多的问题 . 所有的问题,按和(投票)降序排列。

    我不知道如何在LINQ中完成它。

    所以我会有一个称为问题的实体集和另一个称为投票的实体集。

    我试着做分组,让和命令,没有编译:(

    有人能给我提些建议吗?

    3 回复  |  直到 15 年前
        1
  •  3
  •   Amy B    15 年前
    myDataContext.Questions
      .OrderByDescending(q => q.Votes.Select(v => v.VoteValue).Sum())
    

    在查询理解中(未选中):

    from q in myDataContext.Questions
    order q by 
    (
      from v in q.Votes
      select v.VoteValue
    ).Sum() descending
    select q;
    
        2
  •  2
  •   laktak    15 年前

    这主要取决于你的数据,但这里有一个小样本:

    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);
    }
    
        3
  •  1
  •   veggerby    15 年前

    既然你在使用EntitySet,我猜它是linq2sql?假设您有正确设置的引用并有投票权。问题属性:

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

    我在这里收集count()实际上是你想要的?sum()将产生相同的结果,但可能没有意义(?)