Каков самый простой способ проверить, существует ли запись с помощью ORM Dapper?
Мне действительно нужно определить объекты POCO для запроса, где я только хочу проверить, существует ли запись?
Каков самый простой способ проверить, существует ли запись с помощью ORM Dapper?
Мне действительно нужно определить объекты POCO для запроса, где я только хочу проверить, существует ли запись?
int id = ...
var exists = conn.ExecuteScalar<bool>("select count(1) from Table where [email protected]", new {id});
должен работать...
Я думаю, что это может иметь немного меньшие накладные расходы, поскольку нет вызовов функций или преобразований типа данных:
int id = ...
var exists = connection.Query<object>(
"SELECT 1 WHERE EXISTS (SELECT 1 FROM MyTable WHERE ID = @id)", new { id })
.Any();
У вас есть запрос на возврат 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);
}
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 });
Другая опция, которая будет работать с повторяющимися записями, то есть не запрашивать идентификатор таблицы
bool exists = connection.ExecuteScalar<int>(
"select count(1) from Table where [email protected]", new { value = val})
> 0;
Если вам нужно выполнить этот вид запроса к неуникальному полю, вы можете использовать HAVING
для обработки значений больше 1.
SELECT 1
FROM Table
WHERE [email protected]
HAVING COUNT(1) > 0
imho SELECT TOP(1)
лучше чем SELECT COUNT(1)
bool exists = connection.Query<ValueTuple<long>>(
"SELECT top(1) Id FROM MYTABLE WHERE [email protected]",
new {Id}).Any());
ValueTuple<long>
является типом значения. Query<object>
отображается на ссылочный тип и вызывает бокс.