You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C#中使用SqlKata实现NOT IN查询?

使用SqlKata在C#中构建包含NOT IN的SQL查询

需求与现状

你需要用SqlKata构建包含NOT IN的SQL查询,目标SQL如下:

SELECT [User].UID as UserUID, FirstName, LastName FROM [USER] 
WHERE [User].[AccountUID] = @p2  
AND UID NOT IN (SELECT  [User].UID
FROM [User] 
OUTER APPLY [User].[UserProducts].nodes('/ArrayOfUserProduct/UserProduct') AS XmlData(UserProductXMLData)
LEFT OUTER JOIN [UserFormProducts] ON [UserFormProducts].[UserUID] = [User].[UID] 
WHERE [User].[DeleteDate] IS NULL 
AND (([UserFormProducts].[Product] = 0 AND [UserFormProducts].[FormUID] = @p1) OR [UserFormProducts].[UserUID] IS NULL)
AND [User].[AccountUID] = @p2 
)

注:目标SQL中子查询的SELECT [User]应为笔误,实际需返回[User].UID才能匹配NOT IN条件。

你已完成子查询的部分逻辑,现有代码如下:

var countQuery = new Query("User")
                        .Join("User.[UserProduts].nodes('/ArrayOfUserProducts/UserProducts') as XmlData(UserProductXMLData)", j => j, "OUTER APPLY")
                        .LeftJoin("UserFormProducts", "UserFormProducts.UserUID", "User.UID")
                        .WhereNull("User.DeleteDate")
                        .Where(x => x.Where("UserFormProducts.Product", 0).OrWhereNull("UserFormProducts.UserUID"))
                        .Where("UserFormProducts.FormUID", formUID)
                        .Where("User.AccountUID", accountUID)

实现步骤

1. 修正并完善子查询

首先调整子查询,明确返回User.UID字段,同时修正拼写错误(比如UserProduts改为UserProducts,XML节点路径与目标SQL对齐):

var subQuery = new Query("User")
    .Join("User.[UserProducts].nodes('/ArrayOfUserProduct/UserProduct') as XmlData(UserProductXMLData)", j => j, "OUTER APPLY")
    .LeftJoin("UserFormProducts", "UserFormProducts.UserUID", "User.UID")
    .WhereNull("User.DeleteDate")
    .Where(x => x
        .Where("UserFormProducts.Product", 0)
        .Where("UserFormProducts.FormUID", formUID)
        .OrWhereNull("UserFormProducts.UserUID")
    )
    .Where("User.AccountUID", accountUID)
    .Select("User.UID"); // 指定返回UID字段,用于NOT IN匹配

2. 构建主查询并添加NOT IN条件

使用SqlKata的WhereNotIn方法,将子查询作为参数传入,实现目标SQL的NOT IN逻辑:

var mainQuery = new Query("User")
    .Select("User.UID as UserUID", "FirstName", "LastName")
    .Where("User.AccountUID", accountUID)
    .WhereNotIn("User.UID", subQuery); // 核心:用WhereNotIn实现NOT IN子查询

关键说明

  • WhereNotIn是SqlKata原生支持的方法,专门用于构建NOT IN条件,第一个参数为要匹配的字段,第二个参数可以直接传入子查询对象
  • 注意修正代码中的拼写错误,确保表名、XML节点路径与目标SQL完全一致,避免执行报错

内容的提问来源于stack exchange,提问作者cervantes

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 00:10:29