【问题标题】:How do I perform aggregation without the "group by" in Linq?如何在 Linq 中没有“分组依据”的情况下执行聚合?
【发布时间】:2008-11-18 15:44:32
【问题描述】:

我在 linq 中可以找到的所有聚合都有一个“分组依据”子句。我将如何在 LINQ 中编写此查询?我有一个日期值对列表,我想取这些值的平均值:

SELECT AVG(MySuff.Value) AS AvgValue FROM MyStuff

【问题讨论】:

    标签: .net linq c#-3.0


    【解决方案1】:

    早上艾伦:

    int count = (from a in myContext.MyStuff
                select a).Count();
    

    假设 myContext 是 DataContext。

    请注意,这会让您立即执行,您可能不希望这样做。

    您可以将查询结果存储在 var 中:

    var allResults = from a in myContext.MyStuff
                     select a;
    
    //sometime later when needed
    int count = allResults.Count(); // executes the SQL query now!
    

    【讨论】:

    • 抱歉,我没有意识到我的问题不够具体。我要重新措辞一下。无论如何,谢谢。
    • 你还欠我一杯啤酒,因为你取了“艾伦”这个名字:)
    • 对不起!如果 Alan 被带走,AlanR 将是我的下一个选择 ;)
    【解决方案2】:

    LINQ 中有很多非分组聚合运算符。 Alan 的回答显示了 Count 运算符,但 MSDN lists others

    编辑:看到您的编辑后,您似乎需要Average 运算符。

    【讨论】:

      【解决方案3】:

      修改后示例的答案(我相信)是:

      var average = (from a in MyStuff
                    select a.Value).Average();
      

      【讨论】:

      • 在这种情况下,我个人会避免使用查询表达式,而只需使用:var average = MyStuff.Average(a => a.Value)。
      【解决方案4】:

      应该注意的是,Alan 的 LINQ 代码将产生 AlanR 的 SQL 代码,尽管您可能会猜到其他情况。

      但是,这里应该小心。如果写成:

      var q = from a in MyStuff select a;
      int count = q.count();
      foreach(MyStuff m in q) {...}
      

      然后这将生成两个数据库查询:第一个为“select count(*)...”,第二个为“select * ....”

      【讨论】:

        【解决方案5】:

        位排序器

        pairs.Average(a=>a.Value)   
        

        如果没有 join、group 或 let,我认为 Query Expressions (from ...) 不值得。

        【讨论】:

          【解决方案6】:

          感谢大家的帮助。这是我决定的,它有效。

          (from s in series select s).Average( a => a.Value )
          

          问候, 艾伦...R

          【讨论】:

          • 您的查询表达式可能没有做任何有用的事情。试试 s.Average(a => a.Value)
          • Jon Skeet 的意思是series.Average(a => a.Value)
          猜你喜欢
          • 2013-08-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-10-25
          • 1970-01-01
          • 1970-01-01
          • 2016-01-27
          相关资源
          最近更新 更多