不确定我在这里遗漏了什么。基本上,我正在寻找Linq到Nhibernate来执行以下SQL语句:
update SomeTable
set SomeInteger = (SomeInteger + 1)
where SomeInteger > @NotSoMagicNumber
有没有办法做到这一点?
谢谢!
答案 0 :(得分:2)
迟到的答案,但它现在存在于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);
在你的情况下:
session.Query<SomeObject>()
.Update(i => new SomeObject { SomeInteger = i.SomeInteger + 1 });
感谢NHibernate团队!
答案 1 :(得分:1)
与大多数(如果不是全部)LINQ提供程序一样,LINQ to NHibernate仅在读取数据时有用。
要在LINQ的帮助下在NHibernate中实现您想要的功能,您需要获取所有相关对象&amp;更新每一个。类似的东西:
//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);
}
确保在完成所有这些之后冲洗您的会话,&amp;将它全部包装在事务中以最小化数据库更新的数量。
所有这些都表示,根据数据的大小,使用NHibernate进行批量操作可能会遇到性能问题。使用IStatelessSession
可能有助于此目的,但我自己没有尝试过。
UPDATE 如果您在事务中将其包装起来,则不需要执行session.Update
或刷新会话。
答案 2 :(得分:1)
Linq(不是Linq对NHibernate,一般是Linq)没有像SQL那样的批量更新动词。如果您需要像您这样的批量更新语句的效率,我只会坚持使用SQL。