IN を使用する SQL クエリがあるとします。 Dapper を使用して実行します。クエリは次のようになります:
SELECT * FROM [Articles]
WHERE Author IN ('Bob', 'Alice')
Code language: SQL (Structured Query Language) (sql)
これを Dapper で実行する方法は次のとおりです。
static IEnumerable<Article> GetArticles(List<string> authors)
{
using (SqlConnection con = new SqlConnection(GetConnectionString()))
{
return con.Query<Article>("SELECT * FROM Articles WHERE Author IN @authors"
, new { authors=authors });
}
}
Code language: C# (cs)
次に、次のように呼び出します:
var articles = GetArticles(new List<string>() { "Bob", "Alice" });
Code language: C# (cs)
これについては、次の 2 つの重要な点に注意してください。
<オール>かっこを除外
通常の SQL クエリでは、IN に括弧を使用する必要があります。ただし、Dapper でクエリを実行する場合は、それらを除外する必要があります。
IN (@authors) を使用するとどうなるか見てみましょう
static IEnumerable<Article> GetArticles(List<string> authors)
{
using (SqlConnection con = new SqlConnection(GetConnectionString()))
{
return con.Query<Article>("SELECT * FROM Articles WHERE Author IN (@authors)"
, new { authors=authors });
}
}
Code language: C# (cs)
次の不可解な例外が発生します:
これは、Dapper で IN を使用すると、括弧が自動的に挿入されるためです。
次の SQL クエリと同等のものを生成します:
SELECT * FROM [Articles]
WHERE Author IN (('Bob', 'Alice'))
Code language: SQL (Structured Query Language) (sql)
この無効なクエリを SSMS で実行しようとすると、「',' 付近の構文が正しくありません」というエラーが発生します。