2017-03-15 148 views
-1

我有一個簡單的查詢在SQL:轉換SQL查詢LINQ

SELECT 
    l.State, 
    AVG(ls.Amount) As StateAvg 
FROM 
    LeadSales ls 
    JOIN LEADS l on ls.LeadID = l.LeadID 
GROUP BY 
    l.State 

這工作:

enter image description here

有一個小麻煩,把它改爲LINQ(其中queryLeadSales表)的一個IQueryable ...

var StateList = from q in query 
       group q by new 
       { 
         q.Lead.State, 
         q.Amount // <--- it this corrcect? 
       } into g 
       select new AverageLeadSalesPriceItem 
       { 
         StateCode = g.Key.State, 
         StateAverage = ???? 
        }; 

附:

public class AverageLeadSalesPriceItem 
{ 
    public string StateCode { get; set; } 
    public decimal? StateAverage { get; set; } 
} 
+1

可能重複的[獲得平均使用LINQ](http://stackoverflow.com/questions/4590704/get-average-using-linq) – Pikoh

+0

/\ @皮考我看了看那一個,但無法做出答案工作。 –

+0

如何在C#中定義查詢? – jdweng

回答

1

你不遠處。 group子句應該按照您在SQL中分組的相同字段進行分組,然後分組構造對象g就像它自己的Enumerable/Queryable一樣,包含組的所有行,您可以調用集合函數。因此,只有一個字段定義組密鑰,因此不需要匿名類型,然後只需在g上調用Average(),即可定義標識字段平均值的投影。

var StateList = from q in query 
      group q by q.Lead.State into g 
      select new AverageLeadSalesPriceItem 
      { 
        StateCode = g.Key, 
        StateAverage = g.Average(gq=>gq.Amount), 
      }; 

記住,你的Linq查詢,如果基於可查詢的提供商像EF DbSet,不會對數據庫執行,直到你表示你需要「真正的」內存中的對象,無論是含蓄通過調用方法返回一個或多個所述對象(First(),ToArray()等)或顯式使用AsEnumerable()擴展方法。

1

這將是水木清華像

var StateList = from q in query 
       group q by new 
       { 
         q.Lead.State 
       } into g 
       select new AverageLeadSalesPriceItem 
       { 
         StateCode = g.Key.State, 
         StateAverage = g.Average(a=>a.Amount) 
        }; 

注意,如果你要動態地計算骨料(如在SQL),你可以使用專門的圖書館像NReco PivotData(我的這個開發商庫,它對於單個部署項目是免費的)。