掌握 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>
简单的 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>
这种方法错误地计算了空值。 解决方案在于修改 Count()
方法,过滤掉 null ChildId
值:
<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>
这个精炼的 LINQ 查询仅准确地计算非空 ChildId
值,为每个父记录提供正确的子记录计数。 请记住在 LINQ to SQL 中使用左联接和聚合函数时始终考虑空值,以确保数据完整性。
以上是如何通过分组准确统计 LINQ 左连接中的子记录?的详细内容。更多信息请关注PHP中文网其他相关文章!