如何在Dapper中使用'Where In'

Sam*_*Sam 23 .net c# sql orm dapper

我一直尝试在Dapper中使用IEnumerable<string>with WHERE IN子句一段时间没有成功.

在文档中,它确实表示IEnumerable<int>支持在a中使用,WHERE IN但我甚至无法使其工作.

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

我一直收到的错误消息是Sql语法错误. Incorrect syntax near ','.

我已经整理了一些测试代码,希望能够展示我想要实现的目标.


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);

}
Run Code Online (Sandbox Code Playgroud)

Mar*_*ell 48

要做到这里需要什么,短小精悍的需求来改变对飞SQL -所以它需要真正确保它是做正确的事.常规有效的SQL语法包括括号:

WHERE StringId IN (@str)
Run Code Online (Sandbox Code Playgroud)

为了消除歧义,voodoo dapper语法 省略了括号:

WHERE StringId IN @str
Run Code Online (Sandbox Code Playgroud)

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

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

但是短版本:删除括号.

  • @csetzkorn如果你使用非常大的套装,TVP和'INNER JOIN`可能比`IN`更好.dapper完全支持TVP.我不想做的是将每个不同供应商的不同技术限制硬编码到库中 (2认同)