LINQ 子查询使用笔记

核心思想

在 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,需用 ?? 或条件判断兜底。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值