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中文網其他相關文章!