使用单个查询(或在事务中)删除多个对象

时间:2018-10-01 10:12:13

标签: dapper dapper-extensions

我正在将Dapper与Dapper-Extensions一起使用。我目前正在一对一删除所有对象:

dbConnection.Delete<MyObj>(data);

这不仅对性能不利,而且还因为如果删除失败,我想回滚整个操作。是否可以执行“大量”删除,例如传递对象列表而不是data

1 个答案:

答案 0 :(得分:1)

您可以一次通过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;

都不接受对象列表。一个接受谓词,另一个接受单个对象。