2016-08-17 122 views

回答

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)'確保你得到1的回答(true ),即使你有多個具有相同ID /密鑰的記錄。誠然,這應該是一個邊緣案例。 – Caltor

1

你可以有你的查詢返回一個bool:

[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

另一個選項將運行重複記錄,即不查詢表格的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 });