NHibernate从LINQ结果中删除

时间:2011-08-18 08:56:11

标签: linq nhibernate

我想知道nhibernate中删除方法的最佳用法。

如果你去实体而不只是调用delete并发送它,但如果不是,你需要查询它或写一个查询并将其发送到delete方法。

我想知道是否可以写一个linq表达式并将其发送到删除。

是否可以对hql执行Linq转换,而不是调用session.Delete(query) 用生成的hql?

我想调用Session.Delete,并给它一个linq,这样它就可以知道删除什么而不选择数据。你知道一个可以将linq表达式转换为hql的类吗?

5 个答案:

答案 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();