Dapper ORMを使用してレコードが存在するかどうかを確認する最も簡単な方法は何ですか?Dapperでレコードが存在するかどうか確認ORM
本当にレコードが存在するかどうかだけを確認するクエリのPOCOオブジェクトを定義する必要がありますか?
Dapper ORMを使用してレコードが存在するかどうかを確認する最も簡単な方法は何ですか?Dapperでレコードが存在するかどうか確認ORM
本当にレコードが存在するかどうかだけを確認するクエリのPOCOオブジェクトを定義する必要がありますか?
int id = ...
var exists = conn.ExecuteScalar<bool>("select count(1) from Table where [email protected]", new {id});
は動作するはずです...
あなたはブール値を返すようにクエリを持つことができます。
[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);
}
が、私はあなたが過剰に複雑にそれを少しだと思う... –
は、合意されました。 "カウント"は素敵なトリックです! –
いいえ、同意しないでください。 'Count'は、クエリオプティマイザがwhere句の複数の一致を除外できないため、テーブル全体を処理します。最初のものが見つかるとすぐに 'Exists'が返されます。この違いは、特にこのクエリが頻繁に繰り返される場合は、テーブルに多数の行がある場合に重要になります。たとえば、私が見つけたブログポストを見てください。 http://sqlblog.com/blogs/andrew_kelly/archive/2007/12/15/exists-vs-count-the-battle-never-ends.aspx – Volkirith
を私は関数呼び出しやデータ型がありません、これは少しより少ないオーバーヘッドを持っているかもしれないと思いますコンバージョン:
int id = ...
var exists = connection.Query<object>(
"SELECT 1 WHERE EXISTS (SELECT 1 FROM MyTable WHERE ID = @id)", new { id })
.Any();
重複したレコードで実行される別のオプション、つまり、tablのIDを照会しない電子動作するはず
bool exists = connection.ExecuteScalar<int>(
"select count(1) from Table where [email protected]", new { value = val})
> 0;
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 });
ニースとシンプル! – webworm
@webwormキーで1つ以上のレコードを持っていると、微妙なことに注意してください。しかし、それはありません: –
答えを確実に得るために 'COUNT(DISTINCT 1)'を使うだけです)同じID /キーを持つ複数のレコードを持っていても。確かにそれは最悪の場合であるはずです。 – Caltor