如何知道使用Session.Delete(查询)删除了多少个持久对象;

时间:2013-10-03 06:44:16

标签: c# nhibernate sql-delete

我们正在重构一个项目,从简单的MySQL查询到NHibernate的使用。 在MySQL连接器中有ExecuteNonQuery函数,它返回受影响的行。所以

int RowsDeleted = ExecuteNonQuery("DELETE FROM `table` WHERE ...");

会显示有效删除的行数。

如何使用NHibernate实现相同的目标?到目前为止,我可以看到Session.Delete(query);无法实现。

我目前的解决方法是首先加载所有即将删除的对象,然后逐个删除它们,在每次删除时递增计数器。但这将是我可能会考虑的性价比。

1 个答案:

答案 0 :(得分:2)

如果您不介意nHibernate会为每一行创建删除语句,也可能为孤儿和/或其他关系创建其他语句,您可以使用session.Delete

为了获得更好的性能,我建议进行批量删除(参见下面的示例)。

使用Session.delete

如果使用session.Delete删除许多对象,nHibernate会确保保留完整性,如果需要,它会将所有内容加载到会话中。所以没有理由计算你的对象或有一个方法来检索已被删除的对象的数量,因为你只需在运行删除之前进行查询以确定将受影响的对象的数量...... / p>

以下语句将删除所有类型为post的实体。 select语句只会查询数据库中的ID,因此它实际上非常高效......

var idList = session.Query<Post>().Select(p => p.Id).ToList<int>();
session.Delete(string.Format("from Post where Id in ({0})", string.Join(",", idList.ToArray())));

删除的对象数量将等于列表中的ID数...

这实际上是相同的(就nHibernate将对您的数据库进行查询而言)就像您query<T>并循环结果并逐个删除所有这些...

批量删除

您可以使用session.CreateSqlQuery来运行本机SQL命令。它还允许您输入和输出参数。

以下语句只会删除表格中的所有内容

session.CreateSQLQuery(@"Delete from MyTableName");

要检索删除的行数,我们将使用正常的TSQL @@ROWCOUNT变量并通过select输出。要检索选定的行计数,我们必须通过AddScalarUniqueResult添加输出参数,而var rowsAffected = session.CreateSQLQuery(@" Delete from MyTableName; Select @@ROWCOUNT as NumberOfRows") .AddScalar("NumberOfRows", NHibernateUtil.Int32) .UniqueResult(); 只返回整数:

.SetParameter(<name>,<value>)

要传递输入变量,您可以使用var rowsAffected = session.CreateSQLQuery(@" DELETE from MyTableName where ColumnName = :val; select @@ROWCOUNT NumberOfRows;") .AddScalar("NumberOfRows", NHibernateUtil.Int32) .SetParameter("val", 1) .UniqueResult();

执行此操作
@@ROWCOUNT

我对MySQL不太满意,我写的例子是MSSQL,我认为在MySQL中,SELECT ROW_COUNT();等价物是{{1}}?