我們來看下面的例子。
var q =
from p in db.Products
group p by p.CategoryID into g
select g;
在這裡,from p in db.Products表示從表中將對象紀錄取出來。p就是每一個產品。而後面一句,group p by p.CategoryID into g表示對p進行歸類,按什麼歸類呢,就是要按我們設定的CategoryID這個字段。而這個歸類的結果,被重新命名為g,而且是必須重新命名。一旦重新命名,p的作用域就結束了,所以,最後select時,只能select g。
那有人就要問了,不重新命名可以嗎?回答,可以。那你的select語句就沒有了,上面語句等同與
var q = from p in db.Products
group p by p.CategoryID;
這是query表達式中,很少見的沒有select語句的情況。我記憶中,好像只有此一種。我們還是按
var q =
from p in db.Products
group p by p.CategoryID into g
select g;
來講解。因為這種更好理解。在T-Sql中,groupby只是用來做分組統計,計算平均值,最大值,求和等等,而在dlinq中的groupby,則發揮到了極值。我們用ToList()取到結果,來看看上面語句返回的結果。如圖:
整個查詢語句返回八個組,這和我們數據庫的八種產品是對應的。找到最後一個group,點開+號,我們可以看到,裡面有個Key和Results VIEw字段,其中Key為8,是數據庫裡對應的Seafood分類,點開Results VIEw你會驚奇的發現,所有的Seafood都在裡面。我們把代碼改一下,看看dlinq究竟做了什麼。
Northwind db = new Northwind(ConStr);
db.Log = Console.Out;
Query#region Query
var q = from p in db.Products
group p by p.CategoryID into g
select g;
#endregion Query
Verification#region Verification
foreach (var gp in q)
}
return;
#endregion Verification{
單步調試該foreach段代碼,foreach的目的是讓dlinq加載數據。在console Windows上,你可以看到如下輸出。
SELECT [t0].[CategoryID] AS [Key]
FROM [Products] AS [t0]
GROUP BY [t0].[CategoryID]
-- Context: SqlProvider(Sql2005) Model: AttributedMetaModel Build: 2.0.20612.0
SELECT [t0].[ProductID], [t0].[ProductName], [t0].[SupplIErID], [t0].[CategoryID
], [t0].[QuantityPerUnit], [t0].[UnitPrice], [t0].[UnitsInStock], [t0].[UnitsOnO
rder], [t0].[ReorderLevel], [t0].[Discontinued]
FROM [Products] AS [t0]
WHERE ((@x1 IS NULL) AND ([t0].[CategoryID] IS NULL)) OR ((@x1 IS NOT NULL) AND
([t0].[CategoryID] IS NOT NULL) AND (@x1 = [t0].[CategoryID]))
-- @x1: Input Int32 (Size = 0; Prec = 0; Scale = 0) [1]
-- Context: SqlProvider(Sql2005) Model: AttributedMetaModel Build: 2.0.20612.0