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

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'
)

五、性能优化建议

  1. 优先使用 EXISTS 替代 IN
    EXISTS 在子查询匹配到第一条记录时即返回,性能通常优于 IN28。
  2. 避免子查询中的复杂计算
    子查询中应尽量简化条件,减少不必要的字段和表关联6。
  3. 利用索引优化
    确保子查询中的关联字段(如 CustomerIdProductId)已建立索引8。

六、与其他方法的对比

方法Lambda 示例适用场景
EXISTSSqlFunc.Subqueryable<T>().Any()复杂关联条件,性能敏感场景
IN.In(c => c.Id, subQuery)子查询结果集较小
JOIN.InnerJoin<T>((a,b) => a.Id==b.Id)需要返回关联表字段时