2011-03-24 65 views
1

可以说我有Id(主键)列表,我想删除(例如1,2,3,4)。 使用此查询:优化由Castle ActiveRecord生成的删除查询

Console.WriteLine ("DELETE DATA :"); 
ActiveRecordMediator<PostgrePerson>.DeleteAll ("Id IN (1, 2, 3, 4)"); 

我希望控制台输出为:

DELETE DATA : 
NHibernate: DELETE FROM Person WHERE Id IN (1, 2, 3, 4) 

,实际的控制台输出是(我用showsql选项):

DELETE DATA : 
NHibernate: select postgreper0_.Id as Id5_, postgreper0_.Name as Name5_, postgreper0_.Age as Age5_, postgreper0_.Address as Address5_ from Person postgreper0_ w 
here postgreper0_.Id in (1 , 2 , 3 , 4) 
NHibernate: DELETE FROM Person WHERE Id = :p0;:p0 = 1 
NHibernate: DELETE FROM Person WHERE Id = :p0;:p0 = 2 
NHibernate: DELETE FROM Person WHERE Id = :p0;:p0 = 3 
NHibernate: DELETE FROM Person WHERE Id = :p0;:p0 = 4 

什么我应该如何让Castle ActiveRecord生成预期的(优化的)查询?

更新 这是基于公认的答案我的实现。

int[] idList = GetIdList(); 
ActiveRecordMediator<PostgrePerson>.Execute ((session, obj) => { 
    string hql = "DELETE PostgrePerson WHERE Id IN (:idList)"; 
    return session.CreateQuery (hql) 
     .SetParameterList ("idList", idList) 
     .ExecuteUpdate(); 
}, null); 

回答

0

使用Execute callback方法和NHibernate的ISession的运行DML-style HQL DELETE

+0

谢谢。按预期工作:)似乎activerecord的当前版本尚不支持直接从'HqlBasedQuery'使用DML样式的HQL语句 – 2011-03-25 04:12:46