c# – 如何在Dapper中使用“Where In” - 代码日志

c# – 如何在Dapper中使用“Where In”

我一直在尝试失败一段时间,使用IEnumerable< string>在Dapper中有一个WHERE IN子句。

在文档中,它确实说IEnumerable< int>被支持用于WHERE IN,但我甚至不能让它工作。

Dapper allow you to pass in IEnumerable<int> and will automatically parameterize your query.

我不断收到的错误信息是一个Sql语法错误。 ‘,’附近的语法不正确。

我已经汇集了一些测试代码,我希望将展示我正在尝试实现的。

string connString = "Server=*.*.*.*;Database=*;User Id=*;Password=*;";

string sqlStringIn = @"SELECT StringText FROM 
                (SELECT 1 ID, 'A' StringID, 'This is a test' StringText
                UNION SELECT 2 ID, 'B' StringID, 'Another test' StringText
                UNION SELECT 3 ID, 'C' StringID, 'And another' StringText
                UNION SELECT 4 ID, 'D' StringID, 'and again' StringText
                UNION SELECT 5 ID, 'E' StringID, 'yet again' StringText) data
                WHERE StringId IN (@str)";

string sqlIntegerIn = @"SELECT StringText FROM 
                (SELECT 1 ID, 'A' StringID, 'This is a test' StringText
                UNION SELECT 2 ID, 'B' StringID, 'Another test' StringText
                UNION SELECT 3 ID, 'C' StringID, 'And another' StringText
                UNION SELECT 4 ID, 'D' StringID, 'and again' StringText
                UNION SELECT 5 ID, 'E' StringID, 'yet again' StringText) data
                WHERE ID IN (@integer)";


using (SqlConnection conn = new SqlConnection(connString))
{
    conn.Open();

    List<int> integers = new List<int>{ 1, 2, 3 };
    List<string> strings = new List<string> { "A", "B", "C" };

    var parameters = new {str = strings, integer = integers };

    //fails here
    IEnumerable<string> intTest = conn.Query<string>(sqlIntegerIn, parameters, commandType: System.Data.CommandType.Text);

    //and here
    IEnumerable<string> stringTest = conn.Query<string>(sqlStringIn, parameters, commandType: System.Data.CommandType.Text);

}
为了做这些需要,dapper需要即时更改SQL – 所以需要确保它正在做正确的事情。常规有效的SQL语法包括括号:

WHERE StringId IN (@str)

为了消除这一点,voodoo dapper语法省略了括号:

WHERE StringId IN @str

如果它检测到这一点,它会查找一个名为str的参数,并将其扩展为以下之一:

WHERE 1=0 -- if no values
WHERE StringId = @str -- if exactly one value
WHERE StringId IN (@str0, @str1, ...) -- if more than one value

但简短版本:删除括号。

http://stackoverflow.com/questions/19932776/how-do-i-use-where-in-in-dapper

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:c# – 如何在Dapper中使用“Where In”