Удалить несколько объектов одним запросом (или в транзакции) - PullRequest
0 голосов
/ 01 октября 2018

Я использую Dapper с Dapper-Extensions.В настоящее время я удаляю все объекты по одному:

dbConnection.Delete<MyObj>(data);

Это плохо не только для производительности, но и потому, что, если удаление не удается, я хотел бы откатить всю операцию.Есть ли способ выполнить «массовое» удаление, например, передав список объектов вместо data?

1 Ответ

0 голосов
/ 01 октября 2018

Вы можете передать IPredicate для удаления нескольких записей на основе условия (предложение WHERE) за один раз.

Если вы просто передадите пустое значение IPredicate, все записи из таблицы будут удалены.

Следующая функция обрабатывает оба случая:

protected void DeleteBy(IPredicate where)
{//If 'where' is null, this method will delete all rows from the table.
    if(where == null)
        where = new PredicateGroup { Operator = GroupOperator.And, Predicates = new List<IPredicate>() };//Send empty predicateGroup to delete all records.

    var result = connection.Delete<TPoco>(predicate, ......);
}

В приведенном выше коде TPoco - это ваш тип POCO, который сопоставлен с таблицей базы данных, о которой вы говорите.

Вы можетепостроить предикат примерно так:

var predicateGroup = new PredicateGroup { Operator = GroupOperator.And, Predicates = new List<IPredicate>() };
if(!string.IsNullOrEmpty(filterValue))
    predicateGroup.Predicates.Add(Predicates.Field<MyPoco>(x => x.MyProperty, Operator.Eq, PredicateGroup));

Транзакция - это другое.Вы можете поместить весь свой текущий код в транзакцию.Вы также можете поместить мой код в транзакцию.С моим кодом транзакция не имеет большого значения, хотя;хотя рекомендуется всегда использовать транзакции.

Про прохождение списка объектов я никак не вижу.Ниже приведены два метода расширения Dapper Extensions для удаления записи:

public static bool Delete<T>(this IDbConnection connection, object predicate, IDbTransaction transaction = null, int? commandTimeout = default(int?)) where T : class;
public static bool Delete<T>(this IDbConnection connection, T entity, IDbTransaction transaction = null, int? commandTimeout = default(int?)) where T : class;

Ни один из них не принимает список объектов.Один принимает предикат, а другой принимает один объект.

...