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中文网其他相关文章!