nhibernate - 如何使用标准删除 NHibernate 对象?

标签 nhibernate criteria

这应该是一个简单的问题。给定一个条件,如何删除满足条件的实体?

理由:

HQL 和 NH 标准是 NHibernate 特定的构造,因此它们是服务器端 DAL 实现细节。我不希望它们“泄漏”到客户端。因此,我们的客户端提供了 LINQ 表达式供服务器处理。到目前为止,选择请求和 LINQ to NHibernate 处理它们的请求都很好。

但是,现在需要实现批量删除操作。像往常一样,客户端提供一个 LINQ 表达式,服务器将删除满足该表达式的实体。
不幸的是,LINQ to NHibernate 在这里没有帮助。它最多可以将给定的 LINQ 表达式转换为 NHibernate 标准。

无论如何,这就是故事。我想强调的是,客户端根本不知道 NHibernate,我喜欢它保持这种状态。

附言

我正在使用 NH 2.1

最佳答案

您可以使用标准来选择元素的 ID,将它们连接到一个字符串中并使用 HQL 删除它们?

类似的东西:

public void Delete(ICriteria criteria, string keyName, string tableName)
{
    criteria.setProjection(Projections.Attribute(keyName));
    IList<int> itemIds = criteria.List<int>();

    string collection = string.Join(",", Array.ConvertAll<int, string>(itemIds, Convert.ToString));

    Session.HQL(string.Format("delete from {0} where {1} in ({2})", tableName, keyName, collection);
}

这段代码没有经过测试或编译(特别是我不确定 HQL 部分),但我认为您明白了:由于投影,我们不获取整个对象,而只获取索引。

关于nhibernate - 如何使用标准删除 NHibernate 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1326950/

相关文章:

c# - QueryOver 查找别名字符串

c# - NHibernate Linq 在 IQueryable 上使用 Between 子句

mysql - NHibernate 有没有办法清除连接池?

Grails 定义标准

c# - nHibernate session 和多线程

nhibernate - 如何使用 NHibernate 标准执行此操作

java - 这两条指令在性能上有什么区别吗?

java - hibernate 标准 API : how to get the sum of all the values along two columns

java - 为什么 Hibernate 的 createQuery 和 createCriteria 返回不同数量的对象?

具有复合 ID 保存问题的 NHibernate 实体