NHibernate эффективный Удалить с помощью условия LINQ Где - PullRequest
10 голосов
/ 11 августа 2011

Наличие репозитория для NHibernate с запросами LINQ, подобного этому

var q = from x in SomeIQueryable<SomeEntity> where x.A1 == a1 && x.B1 == b1 select x;

Есть ли решение, как получить этот фильтр WHERE и применить его для "удаления одним выстрелом", которое, по-видимому, возможно только черезHQL:

var cmd = string.Format("delete from SomeEntity where x.A1 = '{0}' and x.B1 = {1}", a1, b1);
session.CreateQuery(cmd).ExecuteUpdate();

Ответы [ 4 ]

6 голосов
/ 11 августа 2011

Провайдер NH LINQ и API критериев / запросов не поддерживают условное удаление / обновление.HQL или необработанный SQL - единственные варианты, если вы не рассматриваете расширение NHibernate.

5 голосов
/ 01 ноября 2017

Теперь это возможно с Nhibernate 5.0:

session.Query<SomeIQueryable>()
            .Where(x => x.A1 == a1 && x.B1 == b1)
            .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);
1 голос
/ 01 октября 2014

В настоящее время, начиная с NH 4.0.1, это невозможно. Однако в Jira существует открытая проблема (NH-3659, https://nhibernate.jira.com/browse/NH-3659).). Существует хакерское решение, основанное на пользовательском перехватчике и замене SQL, описанном в http://weblogs.asp.net/ricardoperes/strongly-typed-delete-with-nhibernate,, но я работаю над чистым решением и в конечном итоге отправит запрос на удаление.

0 голосов
/ 12 октября 2013
(from x in NHSession.Query<SomeEntity>()
                  where x.A1 == a1 && x.B1 == b1 
                  select x).ForEach(y => { NHSession.Delete(y) });
        NHSession.Flush();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...