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

如何在SqlKata中拼接多个WHERE条件子句?

解决SqlKata拼接多个WHERE条件块的问题

首先,你不需要先创建一堆独立的Query再去拼接——SqlKata本身就支持直接在主查询中嵌套这类条件块,而且会自动帮你处理括号和AND/OR逻辑,完全适配你的需求。

最优方案:直接在主查询中添加嵌套条件块

你可以用AndWhere方法(如果是第一个条件就用Where),传入一个构建子条件的委托,这样每个规则对应的OR组会被自动包裹在括号里,并且用AND和其他条件拼接,完美匹配你想要的SQL结构:

// 初始化主查询,先添加固定条件
var mainQuery = new Query("ship_schedule")
    .Where("Path", "@path")
    .Where("scheduleDate", "@Date");

// 遍历规则,逐个添加独立的条件块
foreach(var rule in rules)
{
    mainQuery.AndWhere(q => 
        q.Where("Price", "<", rule.Price)
         .OrWhere("GoodsType", "=", rule.Type)
    );
}

这样生成的SQL会自动把每个规则的条件包裹在(...)里,并且用AND连接,和你目标SQL中的结构完全一致。


如果已经有了List<Query>,怎么拼接?

如果因为业务原因你已经提前生成了List<Query>,可以通过SqlKata的编译器提取每个子Query的条件片段,再拼接进主查询:

// 假设你已经有了预先生成的list集合
var compiler = new SqlServerCompiler(); // 根据你的数据库类型选择对应编译器
var mainQuery = new Query("ship_schedule")
    .Where("Path", "@path")
    .Where("scheduleDate", "@Date");

foreach(var subQuery in list)
{
    // 编译子Query,获取它的条件SQL片段和绑定参数
    var compiled = compiler.Compile(subQuery);
    // 把条件片段用括号包裹(保证逻辑优先级),注入到主查询中
    mainQuery.WhereRaw($"({compiled.Sql})", compiled.NamedBindings);
}

这个方法保留了参数绑定机制,能避免SQL注入风险,同时完美复用你已有的子Query集合。


验证生成的SQL

不管用哪种方法,你都可以编译主查询来确认结果是否符合预期:

var compiledMain = compiler.Compile(mainQuery);
Console.WriteLine(compiledMain.Sql);       // 查看最终生成的SQL
Console.WriteLine(string.Join(", ", compiledMain.NamedBindings)); // 查看绑定的参数

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:00:14