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

SqlKata调用Postgres函数时集合参数被拆分的原因及解决方法

问题分析与解决方案

原因

SqlKata的默认参数绑定逻辑会自动遍历IEnumerable类型的参数,把集合中的每个元素拆分为独立参数——这个设计是为了方便处理WHERE id IN (?)这类常见的IN查询场景。另外你代码里误用了SqlServerCompiler,但实际要对接Postgres,编译器的语法适配差异也会加剧参数处理的问题。

解决方法

方法1:切换Postgres编译器+传递数组参数

Postgres原生支持数组类型参数,你需要把集合转为数组,同时切换到PostgresCompiler适配Postgres语法,还要用Postgres对应的驱动连接:

Test(new[] { 1, 2 });

static void Test(IEnumerable<int> ids)
{
    // 注意用NpgsqlConnection而非SqlConnection,这是Postgres的官方驱动连接
    var db = new QueryFactory(new NpgsqlConnection(""), new PostgresCompiler());

    // 把集合转为数组,SqlKata会将其作为单个参数传递
    var query = db.Query("").FromRaw("Test.Test(?)", ids.ToArray());

    var compiler = new PostgresCompiler();
    SqlResult result = compiler.Compile(query);
    // 生成的SQL为:SELECT * FROM Test.Test(@p0),@p0是int[]类型的参数
}

方法2:用RawValue标记单个参数

如果你需要明确指定参数为单个整体,可以用RawValue包装集合,避免SqlKata自动展开:

static void Test(IEnumerable<int> ids)
{
    var db = new QueryFactory(new NpgsqlConnection(""), new PostgresCompiler());

    var arrayParam = new RawValue(ids.ToArray());
    var query = db.Query("").FromRaw("Test.Test(?)", arrayParam);

    var compiler = new PostgresCompiler();
    SqlResult result = compiler.Compile(query);
}

方法3:使用命名参数绑定

直接通过匿名类传递数组参数,让SqlKata识别为单个参数:

static void Test(IEnumerable<int> ids)
{
    var db = new QueryFactory(new NpgsqlConnection(""), new PostgresCompiler());

    var query = db.Query("").FromRaw("Test.Test(@ids)", new { ids = ids.ToArray() });

    var compiler = new PostgresCompiler();
    SqlResult result = compiler.Compile(query);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 10:50:46