読者です 読者をやめる 読者になる 読者になる

Dapper.SqlBuilderでパラメータ指定するもう少しマシな方法

mrgchr.hatenablog.com

以前の投稿で、Dapper.SqlBuilderにパラメータを渡す際に、

var builder = new SqlBuilder();

var pageTemplate = builder.AddTemplate(pageSql);
var countTemplate = builder.AddTemplate(countSql);

if (userId.HasValue)
{
  builder.Where($"t.[UserId] = @{nameof(userId)}");
}

if(isDone.HasValue)
{
  builder.Where($"t.[Done] = @{nameof(isDone)}");
}

builder.OrderBy(string.Format("t.[Id] {0}", orderDesc ? "desc" : "asc"));

using (var conn = new SqlConnection(connectionstring))
{
  var todos = conn.Query<TodoItem>(pageTemplate.RawSql, new { start, end, userId, isDone });
  var count = conn.QueryFirst<int>(countTemplate.RawSql, new { userId, isDone });
}

のように書いていて、最後の無名オブジェクトがダサいなと思いつつも放置していました。

続きを読む

Dapper.SqlBuilderに機能を追加してみる

Dapper.SqlBuilderはシンプルながら便利なライブラリです。

mrgchr.hatenablog.com

今回は独自機能を追加してみようと思います。

続きを読む

ページング処理のSQLアレコレ

昨日のページング処理のSQLを別の書式で書いてみます。

mrgchr.hatenablog.com

続きを読む

Dapper.SqlBuilderで膨大な数のレコードのページ表示を適応的にする

膨大な数のレコードをページ表示する際に、アプリケーション側にページサイズよりも大きい数のデータを読み込むことは効率的ではありません。
今回はDapper.SqlBuilderを用いてページ表示を効率化させてみます。

続きを読む

DapperのSQLプレースホルダをコーディングミスに強くする方法を考える

(追記アリ)
DapperのSQLプレースホルダでコーディングミスをしたので対応策の備忘録です。

文字列でのパラメータ指定が大嫌いなんです

DapperやADO.NETSQL中に"@“から始まる文言を用いることでプレースホルダを表現できます。
例えば下記の例では”@userId"がプレースホルダとなり、"new {userId = 1}“にてパラメータを指定しています。

var sql =
@"
Select
  u.*
From Users as u
Where u.Id = @userId
";

using (var conn = new SqlConnection(connectionstring))
{
  var user = conn.QueryFirstOrDefault<User>(sql, new { userId = 1});
}

今回は、この無名クラスのuserIdをタイポして実行時エラーとなりました。

System.Data.SqlClient.SqlException: 'Must declare the scalar variable "@userId".'

すぐに気が付くようなエラーなので大したことではなかったのですが、やはり実行時エラーは気に入りません。
静的型付言語を使っている以上コンパイル時に最大限エラーを発見したいものです。

続きを読む

Dapperで一対多の関係性をネストされたオブジェクトにマッピングする

Dapperを用いて一対多の関係をマッピングする方法の備忘録です。

データベースのテーブル定義は下記の通りです。

CREATE TABLE [dbo].[Users]
(
  [Id] INT NOT NULL PRIMARY KEY, 
  [Name] NVARCHAR(64) NULL
)

CREATE TABLE [dbo].[TodoItems]
(
  [Id] INT NOT NULL PRIMARY KEY, 
  [Title] NVARCHAR(64) NOT NULL, 
  [Done] BIT NOT NULL, 
  [UserId] INT NOT NULL
)
続きを読む

.NET Core のバージョニングが分かりにくいので調べた

.NET Coreのバージョニング分かりにくい

一生懸命調べました。

続きを読む