INクエリ

  • Dapperは標準で IN() クエリに対応しており、カンマ区切り文字列を手動で組み立てる必要はありません
  • ルール:配列またはListコレクションをパラメータとして渡すと、Dapperが自動的に展開しIN条件を生成します。
  • SQLの記述ルール:WHERE Id IN @ids括弧を追加しないでください。誤った記述例:IN (@ids)
  • メリット:パラメータ化クエリなので、SQLインジェクションのリスクを回避できます。

サンプルコード

using System.Data;
using MySql.Data.MySqlClient;
using Dapper;
using System.Configuration;
using System.Collections.Generic;

static void Main(string[] args)
{
    var connStr = ConfigurationManager.ConnectionStrings["StudentConnection"].ConnectionString;
    using (IDbConnection db = new MySqlConnection(connStr))
    {
        string sql = "SELECT * FROM student WHERE Id IN @ids";

        // int[]配列 / List<int> に対応
        int[] idArray = {3,4};
        List<Student> studentList = db.Query<Student>(
            sql,
            new { ids = idArray }
        ).ToList();
    }
}Code language: JavaScript (javascript)
2通りのパラメータ指定方法が利用可能
// 方法1:配列(元のサンプル通り)
new { ids = new int[] {3,4} }

// 方法2:Listコレクション(実務でよく使われる)
new { ids = new List<int> {3,4,5} }Code language: PHP (php)

一括削除(Delete)

string sqlDelete = "DELETE FROM student WHERE Id IN @ids";
int rows = db.Execute(sqlDelete, new { ids = new int[]{2,5} });Code language: JavaScript (javascript)

複合条件INクエリ

string sql = "SELECT * FROM student WHERE Id IN @ids AND Email IN @emails";
var param = new
{
    ids = new int[]{1,2},
    emails = new string[]{"a@gmail.com","b@gmail.com"}
};
var list = db.Query<Student>(sql, param).ToList();Code language: PHP (php)

INクエリ

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です