mar*_*ark 13 nhibernate criteria
这一定是一个简单的问题.给定一个标准,如何删除满足标准的实体?
理由:
HQL和NH标准是NHibernate特定的构造,因此它们是服务器端DAL实现细节.我不希望他们"泄漏"到客户端.因此,我们的客户端为服务器提供LINQ表达式来处理.到目前为止,请求选择请求和LINQ到NHibernate处理它们的请求就好了.
但是,现在需要实现批量删除操作.像往常一样,客户端提供LINQ表达式,服务器将删除满足表达式的实体.不幸的是,LINQ to NHibernate在这里没有任何帮助.它能做的最多就是将给定的LINQ表达式转换为NHibernate标准.
无论如何,这就是故事.我想强调一下,客户端根本不知道NHibernate,我喜欢它保持这种状态.
PS
我正在使用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);
}
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 传递到会话。
| 归档时间: |
|
| 查看次数: |
16928 次 |
| 最近记录: |