【问题标题】:Update records Nhibernate and Iqueryable更新记录 Nhibernate 和 Iqueryable
【发布时间】:2011-11-14 01:03:14
【问题描述】:

假设我想用另一种状态更新具有某种状态的表的所有行。我正在使用带有 Nhibernate 的存储库模式。我的存储库中有一个方法可以让我获得Iqueryable<T>。

那么我该如何编写更新。我不想获取所有元素,转换为列表然后更新它。事实上,我什至不希望 Nhibernate 选择我的行列表。 它只需要使用我提供的值在数据库中单独运行更新语句。

那我怎样才能做到这一点..

【问题讨论】:

    标签: c# nhibernate c#-4.0 repository-pattern iqueryable


    【解决方案1】:

    NHibernate 通过 HQL 支持这种类型的批量更新。见http://www.nhforge.org/doc/nh/en/index.html#batch-direct。尝试类似的方法...

    public class ThingRepository : Repository<Thing>, IThingRepository
    {
        public int UpdateStatus(ThingStatus oldStatus, ThingStatus newStatus)
        {
            var query = Session.CreateQuery("UPDATE Thing SET Status = :newStatus WHERE Status = :oldStatus")
                .SetEnum("oldStatus", oldStatus)
                .SetEnum("newStatus", newStatus);
    
            return query.ExecuteUpdate();
        }
    }
    

    【讨论】:

    • 有道理.. 但是我需要在 ThingRepository 中对我的会话进行引用,而我没有。我只有在我的 Repository....
    • 嘿阿什利,这是正确的答案。我明白你在说什么想要更新 IQueryable,但是你错过了关于什么是 sql 更新的要点。 IQueryable 是延迟的“选择”语句。更新是一个标量调用,一个只写操作。如果您真的想从 IQueryable 中调用更新,您可以编写一个扩展方法,但您仍然必须访问会话,并且可能也执行 IQueryable(除非您检查了表达式树,这根本不是一项简单的任务)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-21
    • 1970-01-01
    • 1970-01-01
    • 2010-09-30
    • 2011-04-09
    相关资源
    最近更新 更多