2012-11-23 130 views
1

我有一個Employee表與下面要說的記錄SUM和DISTINCT兩個不同的列

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

如何合併這些到一個單一的聲明使用實體框架。我在這裏錯過了什麼。

回答

3

嘗試這樣:

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

該查詢工作得很好。但是,當我看着使用tracestring生成的SQL(示例 - ((System.Data.Objects.ObjectQuery)mainQuery).ToTraceString();)它給了我一個複雜的SQL查詢,並帶有多個選擇和區別。這是正常的嗎? – user275157

+1

這對於LINQ來說相當標準。 SQL查詢處理器*可能*能夠優化查詢以產生有效的計劃。否則,你被困在手寫SQL。 –

1

這個怎麼樣?您可以將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());