Проверьте, существует ли запись с ORM Dapper

Каков самый простой способ проверить, существует ли запись с помощью ORM Dapper?

Мне действительно нужно определить объекты POCO для запроса, где я только хочу проверить, существует ли запись?

Ответ 1

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

должен работать...

Ответ 2

Я думаю, что это может иметь немного меньшие накладные расходы, поскольку нет вызовов функций или преобразований типа данных:

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

Ответ 3

У вас есть запрос на возврат 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);
    }

Ответ 4

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

Ответ 5

Другая опция, которая будет работать с повторяющимися записями, то есть не запрашивать идентификатор таблицы

bool exists = connection.ExecuteScalar<int>(
    "select count(1) from Table where [email protected]", new { value = val})
     > 0;

Ответ 6

Если вам нужно выполнить этот вид запроса к неуникальному полю, вы можете использовать HAVING для обработки значений больше 1.

SELECT 1
FROM Table
WHERE [email protected]
HAVING COUNT(1) > 0

Ответ 7

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> отображается на ссылочный тип и вызывает бокс.