group ... by ... into 是 LINQ 分組查詢的核心語法,產生 IGrouping<TKey, TElement> 序列,每群組擁有 Key 屬性與可列舉的成員。
var products = new[]
{
new { ProductName = "Apple", Category = "Food" },
new { ProductName = "Cat", Category = "Animal" },
new { ProductName = "Dog", Category = "Other" },
new { ProductName = "Pig", Category = "Animal" }
};
var q = from p in products
group p by p.Category into g
orderby g.Key
select g;
foreach (var group in q)
{
Console.WriteLine(group.Key); // Food, Animal, Other
foreach (var item in group)
Console.WriteLine($"\t{item.ProductName}");
}
輸出:
Food
Apple
Animal
Cat
Pig
Other
Dog
情境:Northwind 資料庫,依類別名稱分組顯示產品。
NorthwindDataContext db = new NorthwindDataContext();
var products = db.Products;
var categories = db.Categories;
var query = from result in
(from p in products.AsEnumerable()
join c in categories.AsEnumerable()
on p.CategoryID equals c.CategoryID // 必須用 equals
select new { CategoryName = c.CategoryName, Product = p })
group result by result.CategoryName into g
select g;
foreach (var group in query)
{
Console.WriteLine(group.Key);
foreach (var item in group)
Console.WriteLine($"\t{item.Product.ProductName}");
}
into 之後的範圍變數 (g) 代表群組,隱藏前面的範圍變數。group 子句必須出現在 select 之前,或作為查詢的最後一個子句。IQueryable) 使用 AsEnumerable() 將後續分組在記憶體執行,避免 SQL 轉譯限制。equals 關鍵字,不可用 ==。group element by key into g。orderby g.Key 排序群組。join 後 group,解決主從表分組顯示需求。Key 與 IEnumerable<T> 雙重特性,遍歷極為直觀。