【问题标题】:How do i get the Sum in this Linq query?我如何在这个 Linq 查询中得到 Sum?
【发布时间】:2009-03-24 06:02:01
【问题描述】:

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

我需要得到所有投票最多的问题。例如。所有问题,按 Sum(Vote) 降序排列。

我不确定如何在 linq 中执行此操作。

所以我会有一个名为 Questions 的 EntitySet 和另一个名为 Votes 的 EntitySet。

我试图做 group by 和 let 和 order by 并且没有编译:(

请问大家有什么建议吗?

【问题讨论】:

    标签: linq sum


    【解决方案1】:
    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;
    

    【讨论】:

    • 又好又瘦。你也可以使用(来自myDataContext.Questions中的q ...)格式来编辑它吗? (所以我可以学习如何将它减少到您的精益 linq 语法?)
    【解决方案2】:

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

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

    【讨论】:

    • 很好的详细答案 - 喜欢你如何使用 xml 来获取测试数据。 :) 干杯!
    【解决方案3】:

    既然您使用的是 EntitySet,我猜它是 Linq2SQL?假设您已正确设置参考并具有 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);
    

    我在这里收集 Count() 实际上是您想要的吗? Sum() 会产生相同的结果,但可能没有那么有意义l(?)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-16
      • 1970-01-01
      • 2017-09-23
      • 1970-01-01
      相关资源
      最近更新 更多