Dapperで 'Where In'を使うには

.net c# dapper orm sql

質問

私は今、DapperのWHERE IN節でIEnumerable<string>を使用するのにしばらく失敗しています。

ドキュメントでは、 IEnumerable<int>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);

}

受け入れられた回答

ここで必要なことをするには、大まかにSQLをその場で変更する必要があります。だから、 本当に正しいことをしていることを確かめる必要があります 。通常の有効なSQL構文には、括弧が含まれています。

WHERE StringId IN (@str)

これを明確にするため、 voodooのdapperの構文で 括弧を省略しています。

WHERE StringId IN @str

これを検出すると、 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

しかし、短いバージョン:かっこを削除します。


人気のある回答

空リストを扱うことに興味がある場合は、重要なメモを追加したいと思いoptional 。別名IN句をoptional 。私は、 public int InClauseCount => InClauseList?.Length ?? 0;ようなカウントを含むプロパティを追加することでこれを行いましたpublic int InClauseCount => InClauseList?.Length ?? 0;

その後、このようなSQL内のカウントを使用して...

Select field1, field2
from Table1
where (some condition)
AND (@InClauseCount = 0 OR field1 IN @InClauseList)

私はこれが誰かを助けることを願っています。私は少し時間をかけてこれを解決しようとしましたが、これは部分的に私がDapperを初めて使ったからです。



ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ