有朋友反饋說我提供的sample不能編譯。大概是版本的問題,可以到http://msdn2.microsoft.com/en-us/bb330936.aspx下載for beta1的版本。本節接著講groupby。
上一節,我們講了如何理解groupby返回的結果。本節會延這個思路闡述下去。先來看下面的例子
GroupBy操作中Select的匿名類
var q = from p in db.Products
group p by p.CategoryID into g
select new { CategoryID = g.Key, g };
本例中,select操作中使用了匿名類。本系列中第一次提到匿名類是在http://www.cnblogs.com/126/archive/2006/12/20/503519.html一文中。本文將再一次,闡述匿名類的理解。所謂匿名類,其實質,並不是匿名,而是編譯器幫你去建立了這麼一個類,在使用者看來,好像並沒有去建立,此所謂匿名類。也就是說,編譯器在編譯時間,還是有這個類的,這個類是編譯器自己建立的,其名稱是編譯器界定的。 在上例的匿名類中,有2個property,一個叫CategoryID, 一個叫g。 大家要注意了,這個匿名類,其實質是對返回結果重新進行了封裝。而那個叫做g的property,就封裝了一個完整的分組。如圖,仔細比較和上篇圖的區別。
如果,使用下面的語句。
var q = from p in db.Products
group p by p.CategoryID into g
select new { CategoryID = g.Key,GroupSet = g };
只是把g重新命名為GroupSet.需要用下面的遍曆,擷取每個產品紀錄。
foreach (var gp in q)
{
if (gp.CategoryID == 7)
{
foreach (var p in gp.GroupSet)
{
}
}
}