C# – Dapper で IN を使用する方法

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 つの重要な点に注意してください。

<オール>
  • かっこを除外する必要があります。
  • @authors という 1 つのパラメータを指定し、著者のリストを渡しました。 Dapper はリストの処理方法を知っています。
  • かっこを除外

    通常の 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 で実行しようとすると、「',' 付近の構文が正しくありません」というエラーが発生します。