核心思想
在 Select 中嵌套子查询,动态计算关联数据,常用于统计、条件过滤等场景。
关键点解析
子查询作用域
- 子查询可访问外层主查询的字段(如
p.Id),实现动态关联。 - 示例:统计当前用户参与某活动的次数
ExchangeNum = Subquery<UserRecord>()
.Where(r => r.UserId == currentUserId && r.ActivityId == p.Id)
.Count()
性能优化
-
确保子查询简单高效,避免复杂计算。
-
示例:统计有效订单数量
OrderCount = Subquery<Order>() .Where(o => o.UserId == user.Id && o.Status == "Paid") .Count()
多条件动态值
- 结合外部变量动态选择字段(如多语言)。
Title = input.Lang == "CN" ? p.TitleCN : p.TitleEN
衍生示例
场景1:统计文章评论数
var articles = db.Articles.Select(a => new {
Title = a.Title,
CommentCount = Subquery<Comment>()
.Where(c => c.ArticleId == a.Id && !c.IsDeleted)
.Count()
}).ToList();
场景2:动态权限过滤
var projects = db.Projects.Select(p => new {
Name = p.Name,
CanEdit = Subquery<UserPermission>()
.Where(up => up.UserId == currentUserId && up.ProjectId == p.Id)
.Any()
}).ToList();
注意事项
-
避免N+1查询
-
若主查询返回大量数据,子查询可能导致性能问题,可改用
Join或批量预加载。
-
-
ORM兼容性
-
不同ORM(如EF Core/SqlSugar)子查询语法可能不同,需参考文档调整。
-
-
空值处理
-
子查询结果可能为
null,需用??或条件判断兜底。
-
3674

被折叠的 条评论
为什么被折叠?



