各類產品,數量之和
var q =
from p in db.Products
group p by p.CategoryID into g
select new {
g.Key,
NumProducts = g.Count()
};
如果用OrderDetails表做統計,會更好些,因為,不光可以統計同一種產品,還可以統計同一訂單。
接著統計,同各類產品中,斷貨的產品數量。使用下面的語句。
var q =
from p in db.Products
group p by p.CategoryID into g
select new {
g.Key,
NumProducts = g.Count(p => p.Discontinued)
};
在這裡,count函數裡,使用了Lambda表達式。在上篇中,我們已經闡述了g是一個組的概念。那在該Lambda表達式中的p,就代表這個組裡的一個元素或對象,即某一個產品。還可以使用where條件來限制最終篩選結果
var q =
from p in db.Products
group p by p.CategoryID into g
where g.Count() >= 10
select new {
g.Key,
ProductCount = g.Count()
};
這句在翻譯成sql語句時,欠套了一層,在最外層加了條件。
SELECT [t1].[CategoryID], [t1].[value2] AS [ProductCount]
FROM (
SELECT COUNT(*) AS [value], COUNT(*) AS [value2], [t0].[CategoryID]
FROM [dbo].[Products] AS [t0]
GROUP BY [t0].[CategoryID]
) AS [t1]
WHERE [t1].[value] >= @p0
-- @p0: Input Int32 (Size = 0; Prec = 0; Scale = 0) [10]
-- Context: SqlProvider(Sql2005) Model: AttributedMetaModel Build: 2.0.20612.0
GroupBy操作中GroupBy的匿名類
在第一次談到匿名類時,我們就提到不光Select操作可以使用匿名類,其他操作符也可以。但是,OrderBy不支持。請參考C#3.0入門系列(六)-之OrderBy操作
當用戶既想按產品的分類,又想按供應商來做分組,該怎麼辦呢。這時,我們就該使用匿名類。
var categorIEs =
from p in db.Products
group p by new { p.CategoryID, p.SupplIErID } into g
select new {g.Key, g};
在by後面,new出來一個匿名類。這裡,Key其實質是一個類的對象,Key包含兩個Property,一個是CategoryID,再一個是SupplIErID ,要想取到具體CategoryID的值,需要g.Key.CategoryID,才能訪問到。我們來看dlinq翻譯的T-sql語句。
SELECT [t0].[SupplIErID], [t0].[CategoryID]
FROM [dbo].[Products] AS [t0]
GROUP BY [t0].[CategoryID], [t0].[SupplIErID]
-- Context: SqlProvider(Sql2005) Model: AttributedMetaModel Build: 2.0.20612.0
先按CategoryID,再按SupplIErID ,和匿名類中的循序一樣。
最後一個例子。
var categorIEs =
from p in db.Products
group p by new { Criterion = p.UnitPrice > 10 } into g
select g;
按產品單價是否大於10分類。其結果為兩類,大於的是一類,小於及等於為另一類。好了,剩下的,大家自己多去領會。