SQL 原語
SELECT goodsid, CEILING(qs), SUM(money)
FROM md
GROUP BY goodsid, CEILING(qs)
LINQ 翻譯
var result = from x in md
group x by new { x.goodsid, cqs = Math.Ceiling(x.qs) } into g
select new {
g.Key.goodsid,
g.Key.cqs,
sum = g.Sum(y => y.money)
};
關鍵點解析
- 匿名類型分組鍵:
new { goodsid, cqs = Math.Ceiling(qs) } 將分組依據封裝為不可變對象,LINQ 自動實現 Equals/GetHashCode。
- Math.Ceiling:對應 SQL
CEILING,返回 double,若 qs 為 decimal 需轉型 (double)qs。
- 延遲執行:查詢定義不執行,調用
ToList() 或迭代時才發 SQL(若為 EF/IQueryable)。
Method 語法對照
var result = md
.GroupBy(x => new { x.goodsid, cqs = Math.Ceiling(x.qs) })
.Select(g => new { g.Key.goodsid, g.Key.cqs, sum = g.Sum(y => y.money) });
性能提示
- 若
md 為記憶體集合 (List<T>) 無索引,分組為 O(n) 內存操作。
- 若為 EF Core,確保
goodsid、qs 有索引,生成 SQL 含 GROUP BY、CEILING。
- 大數據量考慮分頁或服務端聚合,避免全量拉取到內存。