C# 如何使用Nhibernate删除多个db实体?

C# 如何使用Nhibernate删除多个db实体?,c#,nhibernate,hibernate,batch-file,batch-processing,C#,Nhibernate,Hibernate,Batch File,Batch Processing,解决此问题的最佳做法是什么?是否有任何内置的批处理功能 示例代码: using (ITransaction transaction = _session.BeginTransaction()) { _session.Delete("FROM myObject o WHERE o.Id = IN(1,2,...99999)"); transaction.Commit(); } 提前感谢。您可以使用HQL删除多个对象 HQL删除示例(您可以在中与HQL一起使用): HQL支持IN子

解决此问题的最佳做法是什么?是否有任何内置的批处理功能

示例代码:

using (ITransaction transaction = _session.BeginTransaction())
{
   _session.Delete("FROM myObject o WHERE  o.Id = IN(1,2,...99999)");
   transaction.Commit();
}

提前感谢。

您可以使用HQL删除多个对象

HQL删除示例(您可以在中与HQL一起使用):


HQL支持IN子句,如果使用setParameterList,甚至可以传入集合

var idList = new List<int>() { 5,3,6,7 };

_session.CreateQuery("DELETE MyDataClass o WHERE o.Id IN (:idList)")
    .SetParameterList("idList", idList)
    .ExecuteUpdate();
var idList=newlist(){5,3,6,7};
_CreateQuery(“删除MyDataClass o,其中o.Id位于(:idList)”中)
.SetParameterList(“idList”,idList)
.ExecuteUpdate();

请注意,正如ddango在评论中提到的那样,对象中指定的关系级联将不会执行,因为运行HQL查询只会转换为DB查询,而不会实际加载任何实体对象。

我在获得有效答案时遇到问题,我发现以下查询100%有效

        Session.CreateQuery("delete Customer c where c.id in (:deleteIds)")
            .SetParameterList("deleteIds", deleteIds)
            .ExecuteUpdate();
Customer是类名而不是表名。
id是小写的,在HQL中它是主键而不是类中的属性名(支持属性名)

如果idList很大怎么办?你将如何处理它?或者nhibernate是否有某种形式的内置批处理?我必须使用nhibernate profiler[nhprof.com]设置一个测试,以查看实际发送到DB的内容,但如果我不得不猜测,我会说它看起来很像您的硬编码示例。您可以在:100中设置批处理大小。但是,根据您的HQL,我猜它只发出了一个查询(如果您在集合中循环并调用Delete,则批处理将适用)。是的,唯一值得一提的警告是,由于您没有加载对象,因此不会应用级联。所以,若客户附加了一个地址行,而它通常是级联删除的,那个么这就不符合要求了
        Session.CreateQuery("delete Customer c where c.id in (:deleteIds)")
            .SetParameterList("deleteIds", deleteIds)
            .ExecuteUpdate();