from p in db.Products
group p by p.CategoryID into g
select g;
into g 重命名分組結果,原 p 作用域結束g.Key 為分組鍵值,g 為該組元素集合foreach (var gp in q) {
if (gp.Key == 2) {
foreach (var item in gp) { /* ... */ }
}
}
select new { CategoryID = g.Key, Products = g };
// 每類最高價
select new { g.Key, MaxPrice = g.Max(p => p.UnitPrice) };
// 每類最低價
select new { g.Key, MinPrice = g.Min(p => p.UnitPrice) };
// 每類平均價
select new { g.Key, AvgPrice = g.Average(p => p.UnitPrice) };
// 每類價格總和
select new { g.Key, Total = g.Sum(p => p.UnitPrice) };
// 每類產品數量
select new { g.Key, Count = g.Count() };
// 條件計數:斷貨產品數
select new { g.Key, DiscontinuedCount = g.Count(p => p.Discontinued) };
where g.Count() >= 10
select new { g.Key, ProductCount = g.Count() };
生成 SQL 含 HAVING COUNT(*) >= 10。
group p by new { p.CategoryID, p.SupplierID } into g
select new { g.Key, g };
g.Key 為匿名類對象,含 CategoryID、SupplierID 兩屬性g.Key.CategoryIDgroup p by new { Criterion = p.UnitPrice > 10 } into g
select g;
按「單價 > 10」布爾值分為兩組。
GROUP BYSELECT ..., MAX(...)WHERE 或 HAVINGGROUP BY col1, col2g 做複雜客戶端運算select new { Key, Agg } 比返回整組更高效