Jaki jest najprostszy sposób sprawdzenia, czy rekord istnieje za pomocą narzędzia ORM Dapper?Sprawdź, czy istnieje rekord z Dapper ORM
Czy naprawdę muszę zdefiniować obiekty POCO dla zapytania, w którym chcę tylko sprawdzić, czy istnieje rekord?
Jaki jest najprostszy sposób sprawdzenia, czy rekord istnieje za pomocą narzędzia ORM Dapper?Sprawdź, czy istnieje rekord z Dapper ORM
Czy naprawdę muszę zdefiniować obiekty POCO dla zapytania, w którym chcę tylko sprawdzić, czy istnieje rekord?
int id = ...
var exists = conn.ExecuteScalar<bool>("select count(1) from Table where [email protected]", new {id});
powinno działać ...
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);
}
które powinny działać, ale myślę, że jesteś nadmiernie komplikuje to trochę ... –
Zgoda. "Count" to fajna sztuczka! –
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
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();
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;
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 });
Ładne i proste! – webworm
@webworm uwaga jest skomplikowana, jeśli masz więcej niż 1 rekord z kluczem, ale ... nie powinieneś tego mieć :) –
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