我想知道nhibernate中删除方法的最佳用法。
如果你去实体而不只是调用delete并发送它,但如果不是,你需要查询它或写一个查询并将其发送到delete方法。
我想知道是否可以写一个linq表达式并将其发送到删除。
是否可以对hql执行Linq转换,而不是调用session.Delete(query) 用生成的hql?
我想调用Session.Delete,并给它一个linq,这样它就可以知道删除什么而不选择数据。你知道一个可以将linq表达式转换为hql的类吗?
答案 0 :(得分:3)
您现在可以直接在linq中使用NHibernate 5.0
//
// Summary:
// Delete all entities selected by the specified query. The delete operation is
// performed in the database without reading the entities out of it.
//
// Parameters:
// source:
// The query matching the entities to delete.
//
// Type parameters:
// TSource:
// The type of the elements of source.
//
// Returns:
// The number of deleted entities.
public static int Delete<TSource>(this IQueryable<TSource> source);
例:
var tooOldDate = System.DateTime.Now.AddYears(5);
session.Query<User>()
.Where(u => u.LastConnection <= tooOldDate)
.Delete();
答案 1 :(得分:1)
LINQ中的Q代表“查询”。所以,不,你不能使用LINQ表达式进行删除。
那就是说,NH的查询语言HQL,确实支持
。就像你可以说“来自Foo where Bar =:something”来获得符合条件的所有foo一样,你可以这样做:
session.CreateQuery("delete Foo where Bar = :something")
.SetParameter("something", ...)
.ExecuteUpdate();
答案 2 :(得分:1)
我已经提交了NH-3659的拉取请求 - 强类型删除。该链接位于nhibernate.jira.com/browse/NH-3659。
答案 3 :(得分:0)
我知道这是一个古老的问题,但对于那些现在正在阅读的人。 NHibernate 5于2017年10月10日发布,增加了删除Linq扩展
来自文档17.6.3. Deleting entities的删除方法扩展需要一个可查询来定义要删除的实体。它立即删除它们。
session.Query<Cat>()
.Where(c => c.BodyWeight > 20)
.Delete();
答案 4 :(得分:-1)
我确信你可以做你想做的事,但最重要的是它没有多大意义(不知道你为什么要在NHibernate中为你提供选择标准单个语句,你的方法最终会导致2次点击数据库),尽管如此,你可以做的一个简单的选择是使用LINQ查询ID并将它们传递给NHibernate
int[] deleteIds = (from c in Customer where {some condition} select c.Id).ToArray<int>();
session.CreateQuery("delete Customer c where c.id in (:deleteIds)")
.SetParameterList("deleteIds", deleteIds)
.ExecuteUpdate();