SQLSUGAR使用LAMBDA表达式如何实现SQL 的EXISTS子查询

在 SqlSugar 中使用 Lambda 表达式实现 SQL 的 EXISTS
子查询,可通过 SqlFunc.Subqueryable
结合 Any()
方法实现。以下是具体实现方式和示例:
一、基础语法实现
通过 Where
条件嵌套子查询表达式,结合 Any()
判断是否存在匹配记录:
var query = db.Queryable<Customer>()
.Where(c => SqlFunc.Subqueryable<Order>()
.Where(o => o.CustomerId == c.Id)
.Any()
)
.ToList();
生成 SQL:
SELECT * FROM [Customer] c
WHERE EXISTS (SELECT 1 FROM [Order] o WHERE o.CustomerId = c.Id)
二、带条件的 EXISTS 子查询
在子查询中添加额外过滤条件:
var query = db.Queryable<Product>()
.Where(p => SqlFunc.Subqueryable<OrderDetail>()
.Where(od => od.ProductId == p.Id && od.Quantity > 10)
.Any()
)
.ToList();
生成 SQL:
SELECT * FROM [Product] p
WHERE EXISTS (SELECT 1 FROM [OrderDetail] od
WHERE od.ProductId = p.Id AND od.Quantity > 10)
三、结合 NOT EXISTS
通过 !
运算符实现 NOT EXISTS
逻辑:
var query = db.Queryable<Customer>()
.Where(c => !SqlFunc.Subqueryable<Order>()
.Where(o => o.CustomerId == c.Id)
.Any()
)
.ToList();
生成 SQL:
SELECT * FROM [Customer] c
WHERE NOT EXISTS (SELECT 1 FROM [Order] o WHERE o.CustomerId = c.Id)
四、多表关联的 EXISTS
子查询中引用多表关联数据:
var query = db.Queryable<Department>()
.Where(d => SqlFunc.Subqueryable<Employee>()
.InnerJoin<Project>((e, p) => e.Id == p.LeaderId)
.Where((e, p) => p.DepartmentId == d.Id && p.Status == "Active")
.Any()
)
.ToList();
生成 SQL:
SELECT * FROM [Department] d
WHERE EXISTS (
SELECT 1 FROM [Employee] e
INNER JOIN [Project] p ON e.Id = p.LeaderId
WHERE p.DepartmentId = d.Id AND p.Status = 'Active'
)
五、性能优化建议
- 优先使用 EXISTS 替代 IN
EXISTS
在子查询匹配到第一条记录时即返回,性能通常优于IN
28。 - 避免子查询中的复杂计算
子查询中应尽量简化条件,减少不必要的字段和表关联6。 - 利用索引优化
确保子查询中的关联字段(如CustomerId
、ProductId
)已建立索引8。
六、与其他方法的对比
EXISTS | SqlFunc.Subqueryable<T>().Any() | 复杂关联条件,性能敏感场景 |
IN | .In(c => c.Id, subQuery) | 子查询结果集较小 |
JOIN | .InnerJoin<T>((a,b) => a.Id==b.Id) | 需要返回关联表字段时 |