Dapper ORMを使用してレコードが存在するかどうかを確認する最も簡単な方法は何ですか?
レコードが存在するかどうかを確認するだけのクエリに対して、POCOオブジェクトを本当に定義する必要がありますか?
int id = ...
var exists = conn.ExecuteScalar<bool>("select count(1) from Table where Id=@id", new {id});
うまくいくはずです...
関数呼び出しやデータ型変換がないので、オーバーヘッドが少し少なくなると思います。
int id = ...
var exists = connection.Query<object>(
"SELECT 1 WHERE EXISTS (SELECT 1 FROM MyTable WHERE ID = @id)", new { id })
.Any();
クエリでブール値を返すことができます。
[Test]
public void TestExists()
{
var sql = @"with data as
(
select 1 as 'Id'
)
select CASE WHEN EXISTS (SELECT Id FROM data WHERE Id = 1)
THEN 1
ELSE 0
END AS result
from data ";
var result = _connection.Query<bool>(sql).FirstOrDefault();
Assert.That(result, Is.True);
}
const string sql = "SELECT CAST(CASE WHEN EXISTS (SELECT 1 FROM MyTable WHERE Id = @Id) THEN 1 ELSE 0 END as BIT)";
bool exists = db.ExecuteScalar<bool>(sql, new { Id = 123 });
一意でないフィールドに対してこの種のクエリを実行する必要がある場合は、HAVING
を使用して、1より大きいカウントを処理できます。
SELECT 1
FROM Table
WHERE Col=@val
HAVING COUNT(1) > 0
imho SELECT TOP(1)
はSELECT COUNT(1)
より優れています
bool exists = connection.Query<ValueTuple<long>>(
"SELECT top(1) Id FROM MYTABLE WHERE MYTABLE.Id=@Id",
new {Id}).Any());
ValueTuple<long>
は値タイプです。 Query<object>
参照型にマップし、ボクシングを引き起こします。
conn.QuerySingleOrDefault<bool>("select top 1 1 from table where id=@id", new { id});
重複するレコードで実行される別のオプション、つまりテーブルのIDをクエリしない
bool exists = connection.ExecuteScalar<int>(
"select count(1) from Table where notanId=@value", new { value = val})
> 0;