2016-08-17 17 views
5

Dapper ORMを使用してレコードが存在するかどうかを確認する最も簡単な方法は何ですか?Dapperでレコードが存在するかどうか確認ORM

本当にレコードが存在するかどうかだけを確認するクエリのPOCOオブジェクトを定義する必要がありますか?

答えて

17
int id = ... 
var exists = conn.ExecuteScalar<bool>("select count(1) from Table where [email protected]", new {id}); 

は動作するはずです...

+0

ニースとシンプル! – webworm

+2

@webwormキーで1つ以上のレコードを持っていると、微妙なことに注意してください。しかし、それはありません: –

+0

答えを確実に得るために 'COUNT(DISTINCT 1)'を使うだけです)同じID /キーを持つ複数のレコードを持っていても。確かにそれは最悪の場合であるはずです。 – Caltor

1

あなたはブール値を返すようにクエリを持つことができます。

[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); 
    } 
+1

が、私はあなたが過剰に複雑にそれを少しだと思う... –

+0

は、合意されました。 "カウント"は素敵なトリックです! –

+0

いいえ、同意しないでください。 'Count'は、クエリオプティマイザがwhere句の複数の一致を除外できないため、テーブル全体を処理します。最初のものが見つかるとすぐに 'Exists'が返されます。この違いは、特にこのクエリが頻繁に繰り返される場合は、テーブルに多数の行がある場合に重要になります。たとえば、私が見つけたブログポストを見てください。 http://sqlblog.com/blogs/andrew_kelly/archive/2007/12/15/exists-vs-count-the-battle-never-ends.aspx – Volkirith

3

を私は関数呼び出しやデータ型がありません、これは少しより少ないオーバーヘッドを持っているかもしれないと思いますコンバージョン:

int id = ... 
var exists = connection.Query<object>(
    "SELECT 1 WHERE EXISTS (SELECT 1 FROM MyTable WHERE ID = @id)", new { id }) 
    .Any(); 
0

重複したレコードで実行される別のオプション、つまり、tablのIDを照会しない電子動作するはず

bool exists = connection.ExecuteScalar<int>(
    "select count(1) from Table where [email protected]", new { value = val}) 
    > 0; 
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 }); 
関連する問題