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

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 });
}

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

下記のようにすれば良かったようです。

var builder = new SqlBuilder();

var pageTemplate = builder.AddTemplate(pageSql, new { start, end });
var countTemplate = builder.AddTemplate(countSql);

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

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

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

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

こちらの方が読みやすくて良いですね。