12

パラメータの型が IEnumerable の場合に null をチェックする方法はありますか? Dapper がリスト パラメーターをパラメーター化されたクエリに変換することはわかっているので、それがリスト パラメーターの null をチェックできない理由だと思いますが、その動作を実現する方法があるかどうか疑問に思っていました。

アイデアは、次のようなことをすることです:

select * from Table1 where (@ids IS NULL OR id in @ids)

現在、そのクエリは次のメッセージとともに SqlException をスローします: スカラー変数 "@ids" を宣言する必要があります。')' 付近の構文が正しくありません。

4

2 に答える 2

13

これは、dapper によって認識され、展開id in @idsとして扱われるパターンです。つまり、入力内のアイテムの数に応じて、次のいずれかになります。ids

(1 = 0) -- empty sequence
(id = @ids_0) -- sequence with 1 element
(id in (@ids_0, @ids_1, ...)) -- sequence with multiple elements

このため、展開後、パラメータ/変数がないため機能しません。そのため、あなたの場合にこれを行う最善の方法は、単純に、tsql のその部分を追加しないことです。例えば:@ids@ids IS NULL

var sql = new StringBuilder("select * from Table1");
if(ids != null && ids.Any())
{
    sql.Append(" where id in @ids");
}
var data = conn.Query<SomeType>(sb.ToString(), new { ids }).ToList();
于 2013-09-09T08:01:27.483 に答える