C# 如何使用NHibernate高效地删除父实体中除最新的x个子实体以外的所有子实体?

C# 如何使用NHibernate高效地删除父实体中除最新的x个子实体以外的所有子实体?,c#,nhibernate,C#,Nhibernate,如果我解释得不好,请原谅我。首先,我将NHibernate2.0与.NET3.5结合使用。基本上,我有一个实体“EntityA”(为了简单起见),它有一个或多个EntityB类型的子实体。每个EntityB都有一个数字,指示它是如何创建的。我想删除除x之外的所有最新实体B。这是净化操作的一部分 我正在努力寻找一种有效的方法来实现这一点,问题是EntityB实例实际上相当复杂,并且本身可能有数百个子对象。EntityA上的EntityB列表是延迟加载的,如果可能的话,我希望避免将其加载到内存中 我

如果我解释得不好,请原谅我。首先,我将NHibernate2.0与.NET3.5结合使用。基本上,我有一个实体“EntityA”(为了简单起见),它有一个或多个EntityB类型的子实体。每个EntityB都有一个数字,指示它是如何创建的。我想删除除x之外的所有最新实体B。这是净化操作的一部分

我正在努力寻找一种有效的方法来实现这一点,问题是EntityB实例实际上相当复杂,并且本身可能有数百个子对象。EntityA上的EntityB列表是延迟加载的,如果可能的话,我希望避免将其加载到内存中

我尝试将HQL查询传递给Session.Delete。不幸的是,HQL似乎不支持top语句,因此我无法进行子选择来选择不删除哪些语句

级联设置在NHibernate中,而不是数据库中。我不确定,但我想知道即使删除是通过HQL完成的,NHibernate是否会加载整个对象图

如有任何建议,将不胜感激

[Edit]不幸的是,任何查询都必须是HQL而不是SQL,因为它需要独立于数据库[/Edit]

干杯


詹姆斯

根据我与nHibernate的经验,我认为你不会找到一个干净的解决方案。但是,没关系。如果框架提供了可行的替代方案,那么跳出框架只是一件坏事。使用参数化SQL语句,确保在代码中清楚说明执行此操作的位置和原因,这将是一个很好的解决方案

编辑:


我很确定您可以为此提出一个独立于数据库的SQL查询,但无论如何。。。与其尝试使用top语句,不如尝试使用MAX()(假设HQL中有这样一个函数)获取top项id,然后构造一个delete语句,条件是该id不是MAX id。

根据我使用nHibernate的经验,我认为您不会找到一个干净的解决方案。但是,没关系。如果框架提供了可行的替代方案,那么跳出框架只是一件坏事。使用参数化SQL语句,确保在代码中清楚说明执行此操作的位置和原因,这将是一个很好的解决方案

编辑:


我很确定您可以为此提出一个独立于数据库的SQL查询,但无论如何。。。与其尝试使用top语句,不如尝试使用MAX()(假设HQL中有这样一个函数)获取top项id,然后构造一个delete语句,条件是该id不是MAX id。

如果没有其他方法,您可以在数据库中设置级联,只需执行以下操作

Session.CreateSQLQuery([SqlStatement]).SetParameter([ParameterStuff]).ExecuteUpdate();

当您需要直接对数据库执行某些操作时,我总是尝试在数据库和nhibernate中设置级联、默认值等。

如果没有其他方法,您可以在数据库中设置级联,然后执行以下操作

Session.CreateSQLQuery([SqlStatement]).SetParameter([ParameterStuff]).ExecuteUpdate();

我总是尝试在数据库和nhibernate中设置级联、默认值等,以便在需要直接对数据库执行操作时使用。

您应该能够使用HQL
删除子c,其中c在(:list)
其中
列表
是仅包含待删除元素的子项列表的副本<代码>列表可以通过HQL查询获得,例如
来自子c,其中c.Parent=:Parent
-HQL查询显然不遵守映射的获取策略(懒惰与急切),并且只有在指示急切地获取子对象时才会急切地获取子对象(因此不要将其放入
左连接获取c.SubChildren
)-然后过滤以仅包含要删除的元素。

您应该能够使用HQL
删除子元素c,其中(:list)
中的c是子元素列表的副本,仅包含要删除的元素<代码>列表可以通过HQL查询获得,例如
来自子c,其中c.Parent=:Parent
-HQL查询显然不遵守映射的获取策略(懒惰与急切),并且只有在指示急切地获取子对象时才会急切地获取子对象(因此不要将其放入
左连接获取c.SubChildren
)-然后过滤以仅包括要删除的元素