首页 >后端开发 >C++ >如何准确统计 LINQ 左连接和分组依据中的子记录?

如何准确统计 LINQ 左连接和分组依据中的子记录?

DDD
DDD原创
2025-01-08 20:21:56943浏览

How to Accurately Count Child Records in a LINQ Left Join and Group By?

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

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn