首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

LINQ to SQL 實戰:Group By / Having 完整指南(從基礎到多鍵分組)

     編輯:關於.NET

Group By 核心語法

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) { /* ... */ }
    }
}

9 種常用變體

1. 匿名類型封裝

select new { CategoryID = g.Key, Products = g };

2. 聚合函數:Max / Min / Average / Sum / Count

// 每類最高價
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) };

3. Having 過濾分組 (Where 子句後置)

where g.Count() >= 10
select new { g.Key, ProductCount = g.Count() };

生成 SQL 含 HAVING COUNT(*) >= 10。

4. 多鍵分組

group p by new { p.CategoryID, p.SupplierID } into g
select new { g.Key, g };
  • g.Key 為匿名類對象,含 CategoryID、SupplierID 兩屬性
  • 訪問:g.Key.CategoryID

5. 表達式分組

group p by new { Criterion = p.UnitPrice > 10 } into g
select g;

按「單價 > 10」布爾值分為兩組。

生成 SQL 特徵

  • 簡單分組 → GROUP BY
  • 帶聚合 → SELECT ..., MAX(...)
  • 帶 Having → 外層嵌套 WHERE 或 HAVING
  • 多鍵 → GROUP BY col1, col2

性能提示

  • 大數據量分組優先在資料庫端完成
  • 避免在分組後對 g 做複雜客戶端運算
  • 只需聚合值時,select new { Key, Agg } 比返回整組更高效
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved