2016-08-17 11 views

Odpowiedz

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

powinno działać ...

+0

Ładne i proste! – webworm

+2

@webworm uwaga jest skomplikowana, jeśli masz więcej niż 1 rekord z kluczem, ale ... nie powinieneś tego mieć :) –

+0

Po prostu użyj 'COUNT (DISTINCT 1)', aby uzyskać odpowiedź 1 (true) nawet jeśli masz wiele rekordów z tym samym identyfikatorem/kluczem. Prawdą jest, że powinno to być przypadkiem skrajnym. – Caltor

1

Można mieć zapytanie zwraca 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

które powinny działać, ale myślę, że jesteś nadmiernie komplikuje to trochę ... –

+0

Zgoda. "Count" to fajna sztuczka! –

+0

Nie, nie zgadzam się. 'Count' przetwarza całą tabelę, ponieważ optymalizator zapytań nie może wykluczyć wielu dopasowań dla Twojej klauzuli where. 'Exists' zwraca się natychmiast po znalezieniu pierwszego. Różnica może być znacząca, gdy masz dużo wierszy w tabeli, szczególnie jeśli zapytanie to jest często powtarzane. Na przykład zobacz ten wpis na blogu, który znalazłem - http://sqlblog.com/blogs/andrew_kelly/archive/2007/12/15/exists-vs-count-the-battle-never-ends.aspx – Volkirith

3

myślę, że może to mieć odrobinę mniej zasobów, ponieważ nie ma wywołanie funkcji lub typ danych Konwersje:

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

Inna opcja, która będzie działać z duplikatami rekordów, tj. bez sprawdzania identyfikatora tabl e

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