【问题标题】:SUM and DISTINCT of two different columns两个不同列的 SUM 和 DISTINCT
【发布时间】:2012-11-23 18:42:10
【问题描述】:

我有一张员工表,上面有以下记录

   EmpID    Salary   Date

    10      2000     1/1/2011
    10      2000     2/1/2011
    20      2000     1/1/2011

我要统计员工总数和总工资(基于其他一些参数)

有没有一种简单的方法可以在实体框架中编写以下 SQL 查询。

  select Sum(Salary), count(distinct(EmployeeID)) from empdb.employeesalary (where clause)

有一个我需要选择这些值的类

  class EmployeeEntity
  {
       decimal TotalAmount;
       int EmployeeCount 
  }

我目前在EF中做了两个查询,如下

  objectcontext.employeesalary.Sum(c => c.Salary);
  objectcontext.employeesalary.Select(c => c.EmployeeID).Distinct().Count();

如何使用 Entity Framework 将这些合并到单个语句中。我在这里错过了什么吗。

【问题讨论】:

    标签: sql-server linq entity-framework entity-framework-4


    【解决方案1】:

    试试这样的:

    objectcontext.employeesalary
       .Where(c => ...)
       .GroupBy(_ => default(string))
       .Select(g => new
       {
          Sum = g.Sum(c => c.Salary),
          Count = g.Select(c => c.EmployeeID).Distinct().Count()
       });
    

    【讨论】:

    • 查询工作正常。但是,当我查看使用 tracestring 生成的 SQL(例如 - ((System.Data.Objects.ObjectQuery)mainQuery).ToTraceString();) 时,它给了我一个带有多个选择和不同的复杂 SQL 查询。这正常吗?
    • 这对于 LINQ 来说是相当标准的。 SQL 查询处理器可能能够优化查询以产生有效的计划。否则,您将无法手动编写 SQL。
    【解决方案2】:

    这个怎么样?您可以将 EF 的结果合并到您的员工实体类中

       var q =  from f in objectcontext.employeesalary
                 where [clause]
                 group f by f.EmpID into g
                 select new EmployeeEntity
                 {
                     TotalAmount = g.Sum(c => c.Salary),
                     EmpmloyeeCount = g.Select(c => c.EmployeeID).Discinct().Count()
                 }
    
        var EmployeeSummary = new List<EmployeeEntity>(q.ToList());
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-02
      相关资源
      最近更新 更多