Оптимизировать запрос на удаление, сгенерированный Castle ActiveRecord - PullRequest
1 голос
/ 24 марта 2011

Допустим, у меня есть список Id (первичный ключ), который я хочу удалить (например, 1, 2, 3, 4).Используя этот запрос:

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); 

1 Ответ

0 голосов
/ 24 марта 2011

Используйте метод Выполнить обратный вызов и запустите HQL DELETE в стиле DML *1004* на NHibernate ISession.

...