【问题标题】:Linq-to-SQL statement for multiple aggregate values in single expression单个表达式中多个聚合值的 Linq-to-SQL 语句
【发布时间】:2010-05-07 15:14:46
【问题描述】:

如何为以下 TSQL 编写 Linq-to-SQL 语句?

select 
  count(*),
  sum(Amount),
  avg(Amount),
  min(Amount),
  max(Amount) 
from 
  TableName

【问题讨论】:

    标签: c# linq-to-sql


    【解决方案1】:

    HACK ALERT,但它有效。尝试按所有记录都共享的条件对记录进行分组:

    var result = from g in db.Employees
            group g by g.Id.GetType() == typeof(int) into gg
            select new 
            {
                Count = gg.Count(),
                Sum = gg.Sum(x => x.Salary)
            };
    

    这会生成 SQL:

    SELECT COUNT(*) AS [Count], SUM([t1].[Salary]) AS [Sum]
    FROM (
    SELECT 1 AS [value], [t0].[Salary]
    FROM [dbo].[Employee] AS [t0]
    ) AS [t1]
    GROUP BY [t1].[value]
    

    涉及到一个子查询,但是嘿!这只是一次 db 之旅

    【讨论】:

      【解决方案2】:

      你可以这样做:

      var result = new
      {
          Count = db.TableName.Count(),
          Sum = db.TableName.Sum(r => r.Amount),
          Average = db.TableName.Avg(r => r.Amount),
          Min = sb.TableName.Min(r => r.Amount),
          Max = db.TableName.Max(r => r.Amount)        
      }
      

      【讨论】:

        【解决方案3】:

        单独提取值可能更容易,但您可以使用匿名类型。

        var aggregates = new {
        Count = context.TableName.Count(),
        Sum = context.TableName.Sum(t => t.Amount),
        Avg = context.TableName.Avg(t => t.Amount),
        Min = context.TableName.Min(t => t.Amount),
        Max = context.TableName.Max(t => t.Amount)
        };
        

        【讨论】:

        • 想要生成 5 个单独的查询?
        • 在 linq 中你不能这样做,那些方法是“终结者”
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-05-24
        • 2012-08-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多