为客户生产软件,主要是使用MS SQL但是使用某些Oracle,决定投入Nhibernate(和C#)。
任务是有效删除,例如10万行从10万行仍然坚持ORM。
我已经尝试了named queries - link,
IQuery sql = s.GetNamedQuery(" native-delete-car")。SetString(0," Kirsten");
sql.ExecuteUpdate();
但我发现的最好的似乎是:
using (ITransaction tx = _session.BeginTransaction())
{
try
{
string cmd = "delete from Customer where Id < GetSomeId()";
var count = _session.CreateSQLQuery(cmd).ExecuteUpdate();
...
因为在删除它们之前可能无法获得所有完整的行。
我的问题是:
如果有更好的方式进行此类删除。
如果有可能像这样得到删除的Where条件:
有一个select语句(使用LinQ to NHibernate)=&gt;这将为DB =&gt;生成适当的SQL我们得到Where条件并将其用于删除。
答案 0 :(得分:1)
如果有更好的方式进行此类删除。
是的,你可以use HQL instead of SQL。
如果有可能获得删除的Where条件[使用表达式]:
不,AFAIK没有实施。由于NHibernate是一个开源项目,我建议您find out if anyone has proposed this和/或discuss it on the mailing list。
答案 1 :(得分:0)
感谢您的快速回复。现在我可能已经有所不同了。
session.CreateSQLQuery(cmd).ExecuteUpdate();
必须包含“从DbTable删除”的cmd。相反,HQL方式
session.CreateQuery(cmd).ExecuteUpdate();
需要使用从MappedCollectionOfObjects删除的cmd。
在这种情况下,它可能也解决了我的另一个问题。
答案 2 :(得分:0)
NHibernate 5.0现在有更好的方法:
var biggestId = GetSomeId();
session.Query<Customer>()
.Where(c => c.Id < biggestId)
.Delete();
文档:
//
// 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);