如果您不介意 nHibernate 将为每一行创建删除语句,并且可能为孤立和/或其他关系创建附加语句,您可以使用 session.Delete。
为了获得更好的性能,我建议进行批量删除(参见下面的示例)。
session.Delete
如果您使用 session.Delete 删除许多对象,nHibernate 会确保完整性得到保留,如果需要的话,它会将所有内容加载到会话中。所以没有真正的理由来计算你的对象或有一种方法来检索已删除的对象的数量,因为你只需在运行删除之前进行查询以确定将受到影响的对象的数量......
以下语句将按 id 删除所有 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 输出它。要检索选定的行数,我们必须通过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();?