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

本文关键字:删除 多少 对象 query 何知道 Session Delete | 更新日期: 2023-09-27 18:33:37

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

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

会告诉我有效删除了多少行。

我怎样才能用NHibernate实现同样的目标?到目前为止,我可以看到这是不可能的Session.Delete(query);.

我目前的解决方法是首先加载所有要删除的对象,然后逐个删除它们,每次删除时增加一个计数器。但我认为这将带来性价比。

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

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

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

会期。删除

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

以下语句将删除按 id 发布类型的所有实体。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 输出它。要检索选定的行计数,我们必须通过 AddScalar 将输出参数添加到创建的查询中,UniqueResult简单返回整数:

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();
我对MySQL

不是那么舒服,我写的例子是针对MSSQL的,我认为在MySQL中@@ROWCOUNT等价物是SELECT ROW_COUNT();