LINQ – 左連接、分組以及精確計數的技巧
將複雜的SQL查詢轉換為LINQ to SQL有時會很棘手。一個典型的例子就是執行左連接、按列分組併計算滿足特定條件的記錄數。
考慮以下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>
此查詢從ParentTable和ChildTable兩個表中擷取ParentId和符合的ChildId計數。
要將其轉換為LINQ to SQL,首先進行左連接:
<code class="language-csharp">from p in context.ParentTable join c in context.ChildTable on p.ParentId equals c.ChildParentId into j1</code>
然而,COUNT(c.ChildId)
部分需要仔細處理。如果沒有特別的考慮,LINQ產生的SQL將始終傳回COUNT(*)
,這可能無法提供預期的結果。
為了精確地只計算匹配的ChildId值,在into
子句之後加入以下內容:
<code class="language-csharp">from j2 in j1.DefaultIfEmpty()</code>
這確保瞭如果沒有找到匹配的子記錄,則將空值賦給j2。
最後,執行分組和計數:
<code class="language-csharp">group j2 by p.ParentId into grouped select new { ParentId = grouped.Key, Count = grouped.Count(t => t.ChildId != null) }</code>
此程式碼依ParentId分組,只計算ChildId不為空的記錄。結果是一個具有ParentId和Count屬性的對象,與原始SQL查詢的格式相符。 這確保了我們只計算存在子記錄的情況,避免了因左連接帶來的空值影響計數結果的準確性。
以上是如何準確統計 LINQ 左連接和分組依據中的子記錄?的詳細內容。更多資訊請關注PHP中文網其他相關文章!