如何使用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;
核心逻辑说明
- 分组统计:先通过子查询对子表按
parentId分组,计算每个父ID对应的子记录总数,得到包含父ID和对应次数的临时集合。 - 关联排序:将父表与这个临时集合关联,再按统计出的子记录次数进行排序,最后仅选择父表的列返回。
内容的提问来源于stack exchange,提问作者Robin Khan
相关产品推荐
相关产品推荐

