Linq到Nhibernate批量更新查询等价物?

Linq到Nhibernate批量更新查询等价物?,linq,nhibernate,bulk,Linq,Nhibernate,Bulk,不确定我是否遗漏了什么。基本上,我希望Linq to Nhibernate执行以下SQL语句: update SomeTable set SomeInteger = (SomeInteger + 1) where SomeInteger > @NotSoMagicNumber 有办法吗 谢谢 与大多数(如果不是全部)LINQ提供程序一样,LINQ到NHibernate仅在读取数据时有用 为了在LINQ的帮助下在NHibernate中实现您想要做的事情,您需要获取所有相关对象并更新每个对象

不确定我是否遗漏了什么。基本上,我希望Linq to Nhibernate执行以下SQL语句:

update SomeTable
set SomeInteger = (SomeInteger + 1)
where SomeInteger > @NotSoMagicNumber
有办法吗

谢谢

与大多数(如果不是全部)LINQ提供程序一样,LINQ到NHibernate仅在读取数据时有用

为了在LINQ的帮助下在NHibernate中实现您想要做的事情,您需要获取所有相关对象并更新每个对象。比如:

//NHibernate session initialisation & finalisation skipped for brevity

var relevantObjects = from i in session.Linq<SomeObject>()
                      where i.SomeInteger > notSoMagicNumber
                      select i;

foreach (SomeObject item in relevantObjects)
{
    i.SomeInteger++;
    session.Update(item);
}
//为简洁起见,跳过了NHibernate会话初始化和最终确定
var relevantObjects=来自会话中的i.Linq()
其中i.SomeInteger>notSoMagicNumber
选择i;
foreach(相关对象中的SomeObject项)
{
i、 SomeInteger++;
会议.最新情况(项目1);
}
确保在此之后刷新会话,并将其全部打包到事务中,以尽量减少数据库更新的次数

综上所述,根据数据的大小,在使用NHibernate进行批量操作时可能会遇到性能问题。使用
IStatelessSession
可能会有帮助,但我自己还没有尝试过


UPDATE结果表明,如果将其打包到事务中,则不需要执行
会话。更新
或刷新会话。

Linq(不是Linq到NHibernate,通常是Linq)没有SQL那样的批量更新谓词。如果您需要像您这样的批量更新语句的效率,我会坚持使用SQL。

稍后回答,但它现在存在于Nhibernate 5.0中

    //
    // Summary:
    //     Update all entities selected by the specified query. The update operation is
    //     performed in the database without reading the entities out of it.
    //
    // Parameters:
    //   source:
    //     The query matching the entities to update.
    //
    //   expression:
    //     The update setters expressed as a member initialization of updated entities,
    //     e.g. x => new Dog { Name = x.Name, Age = x.Age + 5 }. Unset members are ignored
    //     and left untouched.
    //
    // Type parameters:
    //   TSource:
    //     The type of the elements of source.
    //
    // Returns:
    //     The number of updated entities.
    public static int Update<TSource>(this IQueryable<TSource> source, Expression<Func<TSource, TSource>> expression);
//
//总结:
//更新指定查询选择的所有实体。更新操作已完成
//在数据库中执行,而不从中读取实体。
//
//参数:
//资料来源:
//匹配要更新的实体的查询。
//
//表达方式:
//表示为已更新实体的成员初始化的更新设置器,
//例如,x=>新狗{Name=x.Name,Age=x.Age+5}。未设置的成员将被忽略
//没有动过。
//
//类型参数:
//t来源:
//源的元素的类型。
//
//返回:
//更新实体的数量。
公共静态int更新(此IQueryable源、表达式);
就你而言:

    session.Query<SomeObject>()
            .Update(i => new SomeObject { SomeInteger = i.SomeInteger + 1 });
session.Query()
.Update(i=>newsomeobject{SomeInteger=i.SomeInteger+1});
感谢NHibernate团队