You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用C# LINQ根据子表引用次数对父表数据排序?

按子表引用次数排序父表的正确查询方法

你原来的查询存在两个关键问题:一是直接调用count(c.parentId)的语法错误,二是未先分组统计子表引用次数就尝试排序,导致逻辑无法正确执行。以下是两种符合需求的实现方案:

方案一:保留所有父表项(含无子记录的项)

该方案通过左连接实现,即使父表中没有对应子记录的条目也会被保留,此时其引用次数按0处理:

var parents = from p in context.parentTbl
              // 先对子表按parentId分组,统计每个父ID的子记录数量
              join childCountGroup in (
                  from c in context.ChildTbl
                  group c by c.parentId into g
                  select new { ParentId = g.Key, ChildCount = g.Count() }
              ) on p.Id equals childCountGroup.ParentId into parentWithCount
              // 处理无对应子记录的父表项
              from pwc in parentWithCount.DefaultIfEmpty()
              // 按子记录数量排序,可改为ascending实现升序
              orderby pwc?.ChildCount ?? 0 descending
              // 仅选择父表的列
              select p;

方案二:仅保留有子记录的父表项

如果只需要筛选出存在子记录的父表数据,可使用内连接,去掉DefaultIfEmpty()即可:

var parents = from p in context.parentTbl
              join childCountGroup in (
                  from c in context.ChildTbl
                  group c by c.parentId into g
                  select new { ParentId = g.Key, ChildCount = g.Count() }
              ) on p.Id equals childCountGroup.ParentId
              orderby childCountGroup.ChildCount descending
              select p;

核心逻辑说明

  1. 分组统计:先通过子查询对子表按parentId分组,计算每个父ID对应的子记录总数,得到包含父ID和对应次数的临时集合。
  2. 关联排序:将父表与这个临时集合关联,再按统计出的子记录次数进行排序,最后仅选择父表的列返回。

内容的提问来源于stack exchange,提问作者Robin Khan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 12:01:13