如何在 Dapper Query 的动态参数中传递多个条件,就像我们为 IN 运算符传递的一样

Posted

技术标签:

【中文标题】如何在 Dapper Query 的动态参数中传递多个条件,就像我们为 IN 运算符传递的一样【英文标题】:How to pass multiple condition in dynamic parameter in Dapper Query like we pass for IN operator 【发布时间】:2021-08-07 14:30:58 【问题描述】:

我想在查询我的 PostgreSQL 数据库时传递多个实体代码。我收到以下代码错误: 我希望查询如下所示:

        SELECT * FROM public.test WHERE entity_code IN('value1', 'value2');

下面是我的代码,在我传递单个值的情况下有效:

        string query = "SELECT * FROM public.test WHERE entity_code = @Entity_Code";

        Dictionary<string, object> dictionary = new Dictionary<string, object>();
        dictionary.Add("@Entity_Code", "value1");

        var connection = _postgreSqlContext.Database.GetDbConnection();
        var results = connection.Query<Test>(query, new DynamicParameters(dictionary));

以下是在针对同一参数添加多个值时不起作用的代码:

    string query = "SELECT * FROM public.test WHERE entity_code IN @Entity_Code";

    Dictionary<string, object> dictionary = new Dictionary<string, object>();
    dictionary.Add("@Entity_Code", new string[] "value1", "value2" );

    var connection = _postgreSqlContext.Database.GetDbConnection();
    var results = connection.Query<Test>(query, new DynamicParameters(dictionary));

【问题讨论】:

【参考方案1】:

Postgres 的 IN-syntax 略有不同。你应该使用ANY:

string query = "SELECT * FROM public.test WHERE entity_code = ANY(@Entity_Code)";

var dictionary = new Dictionary<string, object>();
dictionary.Add("@Entity_Code", new string[] "value1", "value2" );

var connection = _postgreSqlContext.Database.GetDbConnection();
var results = connection.Query<Test>(query, new DynamicParameters(dictionary));

查看这个问题的答案:IN vs ANY operator in PostgreSQL

【讨论】:

以上是关于如何在 Dapper Query 的动态参数中传递多个条件,就像我们为 IN 运算符传递的一样的主要内容,如果未能解决你的问题,请参考以下文章

如何使用字符串作为参数遍历 Dapper 动态查询结果?

使用Dapper时,如何将MySqlParameters[] 变成Dapper.DynamicParameters动态对象

在 mvc 中使用 dapper 的动态结果

如何在 Dapper .Query<>() 中添加新的 PropertyType

P04:路由跳转时用query传递和接受参数

Dapper入门教程——Dapper Query查询