Dapper を使用すると、「クエリを実行し、その結果 (存在する場合) を厳密に型指定されたリストにマップする」ことが簡単になります。この投稿では、Dapper を使用して select、insert、update、および delete ステートメントを実行する方法を示します。
クイックリンク
- テーブルとクラスの例
- 例を挿入
- 例を選択
- 更新の例
- 削除の例
テーブルとクラスの例
この投稿では、次の表を使用します:
CREATE TABLE [dbo].[MyEntities](
[Id] [int] IDENTITY(1,1) NOT NULL,
[Text] [nvarchar](max) NOT NULL,
CONSTRAINT [PK_MyEntities] PRIMARY KEY CLUSTERED
(
[Id] ASC
)
)
上記は単純な int
の表です ID 列と nvarchar
テキストの列。 SQL Management studio からのこのイメージを以下に示します:
EFMigrationsHistory テーブルは気にしないでください。以前のブログ投稿からこのデータベースを再利用しました :)
テーブルには次のマッチング クラスを使用します:
[Table("MyEntities")]
public class MyEntity
{
public int Id { get; set; }
public string Text { get; set; }
}
クラスを単数形にするのが好きなので、テーブルとは異なる名前が付けられています。これを機能させるには、Table
を追加する必要があります。 注釈。それ以外は、そのプロパティはテーブルの列と一致します。
挿入
SQL 接続で Execute メソッドを直接使用して、行を挿入できます。
using (var sqlConnection = new SqlConnection(@"Data Source=localhost;Initial Catalog=MyDb;Integrated Security=True;"))
{
sqlConnection.Execute("INSERT INTO [dbo].[MyEntities] (Text) VALUES (@Text);", new MyEntity { Text = "this is a text" });
}
上記では、標準の SqlConnection を使用してデータベースへの接続を開きます。次に、Execute
に挿入するエンティティとともに SQL 挿入ステートメントを提供します。 方法。 execute メソッドは、新しく作成された行の ID ではなく、影響を受けた行の数を返します。ただし、 output
を使用して取得できます 次の SQL ステートメントの句:
using (var sqlConnection = new SqlConnection(@"Data Source=localhost;Initial Catalog=MyDb;Integrated Security=True;"))
{
var identity = sqlConnection.QuerySingle<int>("INSERT INTO [dbo].[MyEntities] (Text) output inserted.Id VALUES (@Text);"
, new MyEntity { Text = "this is a text" });
}
Dapper.Contrib の使用
nuget パッケージ Dapper.Contrib を使用して、上記をさらに簡素化できます。前の例は、Dapper.Contrib を使用して次のように縮小できます。
using (var sqlConnection = new SqlConnection(@"Data Source=localhost;Initial Catalog=MyDb;Integrated Security=True;"))
{
var identity = sqlConnection.Insert(new MyEntity { Text = "this is a text" });
}
Dapper Contrib を使用すると、SQL を記述する必要がなく、それ自体でマップされます。 ID の取得も Insert ステートメントに組み込まれています。
選択
接続の多くの拡張メソッドの 1 つを使用して、Dapper で簡単なクエリを作成できます。以下は Query
の使用例です。 メソッド:
using (var sqlConnection = new SqlConnection(@"Data Source=localhost;Initial Catalog=MyDb;Integrated Security=True;"))
{
string sql = "SELECT id, text FROM [dbo].[MyEntities] WHERE id = @id";
var results = sqlConnection.Query<MyEntity>(sql, new { id = 1 });
}
上記では、クラス MyEntity
にマップされた MyEntities のリストを返します。 .レコードのリストではなく、単一のレコードを選択することもできます:
using (var sqlConnection = new SqlConnection(@"Data Source=localhost;Initial Catalog=MyDb;Integrated Security=True;"))
{
string sql = "SELECT id, text FROM [dbo].[MyEntities] WHERE id = @id";
var results = sqlConnection.Query<MyEntity>(sql, new { id = 1 });
}
上記は、 Single
という名前のものが期待どおりに機能します to - QueryFirstOrDefault
に対して、1 つのレコードが返されない場合は失敗します。 一致する最初の行を返すか、デフォルト値 (この場合は null) を返します:
using (var sqlConnection = new SqlConnection(@"Data Source=localhost;Initial Catalog=MyDb;Integrated Security=True;"))
{
string sql = "SELECT id, text FROM [dbo].[MyEntities] WHERE id = @id";
var results = sqlConnection.QueryFirstOrDefault<MyEntity>(sql, new { id = 1 });
}
更新
Dapper で更新ステートメントを実行することは、挿入に似ています。
using (var sqlConnection = new SqlConnection(@"Data Source=localhost;Initial Catalog=MyDb;Integrated Security=True;"))
{
string sql = "update [dbo].[MyEntities] set text = @text WHERE id = @id";
var results = sqlConnection.Execute(sql, new MyEntity { Id = 1, Text = "this is another text"});
}
In the above we update the text of the entity with id 1. コードは、更新ステートメントを記述してから一致するパラメーターを提供する必要があるため、insert に似ています。 Execute メソッドは、影響を受けた行数を返します。
Dapper.Contrib の使用
nuget パッケージ Dapper.Contrib を使用して、上記を簡素化できます。前の例は、Dapper.Contrib を使用して次のように縮小できます。
using (var sqlConnection = new SqlConnection(@"Data Source=localhost;Initial Catalog=MyDb;Integrated Security=True;"))
{
var results = sqlConnection.Update(new MyEntity { Id = 2, Text = "this is another text" });
}
上記では、自分で SQL を記述する必要はありませんが、更新したいオブジェクトを提供するだけです。
削除
Dapper で削除ステートメントを実行することは、挿入と更新に似ています。
using (var sqlConnection = new SqlConnection(@"Data Source=localhost;Initial Catalog=MyDb;Integrated Security=True;"))
{
string sql = "delete from [dbo].[MyEntities] WHERE id = @id";
var results = sqlConnection.Execute(sql, new MyEntity { Id = 1 });
}
上記では、id 1 のエンティティを削除します。SQL ステートメントを記述してから、一致するパラメーターを指定する必要があるため、コードは挿入と更新に似ています。 Execute メソッドは、影響を受けた行数を返します。
Dapper.Contrib の使用
nuget パッケージ Dapper.Contrib を使用して、上記を簡素化できます。前の例は、Dapper.Contrib を使用して次のように縮小できます。
using (var sqlConnection = new SqlConnection(@"Data Source=localhost;Initial Catalog=MyDb;Integrated Security=True;"))
{
var results = sqlConnection.Delete(new MyEntity { Id = 2 });
}
上記では、自分で SQL を記述する必要はありませんが、削除したいオブジェクトを提供するだけです。
それだけです
この投稿がお役に立てば幸いです。不明な点やその他のフィードバックがある場合は、下のコメント欄でお知らせください。