如何使用条件删除NHibernate对象?

mar*_*ark 13 nhibernate criteria

这一定是一个简单的问题.给定一个标准,如何删除满足标准的实体?

理由:

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

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

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

PS

我正在使用NH 2.1

mad*_*rog 7

您可以使用条件来选择元素的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);
}
Run Code Online (Sandbox Code Playgroud)

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


Dan*_*anB -3

在您的存储库/dao/persistencemanager/任何类中:

public IEnumerable<T> FindAll(DetachedCriteria criteria)

        {

            return criteria.GetExecutableCriteria(Session).List<T>();

        }
Run Code Online (Sandbox Code Playgroud)

进而

public void Delete(DetachedCriteria criteria)

        {

            foreach (T entity in FindAll(criteria))

            {

                Delete(entity);

            }

        }
Run Code Online (Sandbox Code Playgroud)

请参阅 Davy Brion 的帖子Data Access with NHibernate

编辑

据我所知,如果你想使用 Criteria,你需要加载对象并迭代它们以删除它们。或者使用 HQL 或将 SQL 传递到会话。

  • 但在处理大量对象时,我不喜欢这种方法,因为它需要先从数据库中获取所有实体,然后才能删除它们。 (6认同)
  • 确实如此,难道您不必使用 HQL 来发出“DELETE FROM WHERE”SQL 语句吗? (3认同)
  • 伙计们,你们不是认真的。一定会有更好的办法! (2认同)