首頁 > 後端開發 > C++ > 如何準確地將複雜的 SQL 左側連接和聚合查詢轉換為 LINQ?

如何準確地將複雜的 SQL 左側連接和聚合查詢轉換為 LINQ?

Barbara Streisand
發布: 2025-01-08 20:26:51
原創
346 人瀏覽過

How to Accurately Translate a Complex SQL Left Join and Aggregation Query into LINQ?

LINQ:掌握複雜的連接與聚合

本文示範如何將複雜的 SQL LEFT JOIN 和聚合查詢準確地轉換為 LINQ。 此範例重點在於準確計數至關重要的場景,避免在聚合中包含空值。

這是 SQL 查詢:

<code class="language-sql">SELECT p.ParentId, COUNT(c.ChildId)
FROM ParentTable p
  LEFT OUTER JOIN ChildTable c ON p.ParentId = c.ChildParentId
GROUP BY p.ParentId</code>
登入後複製

此 SQL 查詢有效地檢索父 ID 並計算其關聯的子 ID。 直接 LINQ 翻譯需要正確處理 LEFT JOIN、分組和聚合。

最初的、可能有缺陷的 LINQ 嘗試可能如下:

<code class="language-csharp">from p in context.ParentTable
join c in context.ChildTable on p.ParentId equals c.ChildParentId into j1
from j2 in j1.DefaultIfEmpty()
group j2 by p.ParentId into grouped
select new { ParentId = grouped.Key, Count = grouped.Count() }</code>
登入後複製

此程式碼的問題在於,grouped.Count() 對群組中的 所有 元素進行計數,包括 LEFT JOIN 產生的空值。 這會導致計數不準確。

解決方案在於細化聚合:

<code class="language-csharp">from p in context.ParentTable
join c in context.ChildTable on p.ParentId equals c.ChildParentId into j1
from j2 in j1.DefaultIfEmpty()
group j2 by p.ParentId into grouped
select new { ParentId = grouped.Key, Count = grouped.Count(t => t.ChildId != null) }</code>
登入後複製

透過使用 grouped.Count(t => t.ChildId != null),我們確保僅對非空 ChildId 值進行計數,從而準確反映 SQL 查詢的行為。 此修改後的 LINQ 查詢提供了正確的結果,避免了在聚合中計算空值的陷阱。

以上是如何準確地將複雜的 SQL 左側連接和聚合查詢轉換為 LINQ?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板