如何在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
相关产品推荐
相关产品推荐

