NHibernate удалить из результатов LINQ - PullRequest
3 голосов
/ 18 августа 2011

Мне интересно, как лучше всего использовать метод удаления в nhibernate.

Если вы идете к объекту, чем просто вызываете delete и отправляете его, но если нет, вам нужно запросить его или написать запрос и отправить его для удаления метода.

Мне интересно, можно ли написать выражение linq и отправить его для удаления.

Можно ли выполнить преобразование Linq в hql и затем вызвать сессию. Удалить (запрос) с сгенерированным hql?

Я хочу вызвать Session.Delete и дать ему linq, чтобы он мог знать, что удалять, не выбирая данные. Знаете ли вы класс, который может преобразовать выражение linq в hql?

Ответы [ 5 ]

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

Теперь вы можете напрямую в linq с NHibernate 5.0

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

Exemple:

        var tooOldDate = System.DateTime.Now.AddYears(5);
        session.Query<User>()
            .Where(u => u.LastConnection <= tooOldDate)
            .Delete();
1 голос
/ 12 ноября 2014

Я отправил запрос на извлечение NH-3659 - строго типизированное удаление.Ссылка доступна по адресу nhibernate.jira.com/browse/NH-3659.

1 голос
/ 18 августа 2011

Q в LINQ означает «Запрос».Итак, нет, вы не можете использовать выражение LINQ для удаления.

Тем не менее, язык запросов NH, HQL, поддерживает , что поддерживает.

Точно так жечто вы можете сказать "из Foo, где Bar =: что-то", чтобы получить все foos, соответствующие условию, вы можете сделать это:

session.CreateQuery("delete Foo where Bar = :something")
       .SetParameter("something", ...)
       .ExecuteUpdate();
0 голосов
/ 29 января 2018

Я знаю, что это старый вопрос, но для тех, кто читает это сейчас.NHibernate 5, выпущенный 10 октября 2017 года, добавил расширение Delete Linq

из документации 17.6.3.Удаление сущностей Расширение метода Delete ожидает запрос, определяющий сущности для удаления.Он немедленно удаляет их.

session.Query<Cat>()
    .Where(c => c.BodyWeight > 20)
    .Delete();
0 голосов
/ 05 сентября 2011

Я уверен, что было бы возможно сделать то, что вы хотите, но суть в том, что это не имеет большого смысла (не уверен, почему вы хотите дать NHibernate критерии выбора, когда вы можете сделать это в одно утверждение, ваш подход в конечном итоге вызовет 2 обращения к базе данных), сказав, что одним из простых вариантов, который вы можете сделать, является запрос идентификаторов с помощью LINQ и передача их в NHibernate

int[] deleteIds = (from c in Customer where {some condition} select c.Id).ToArray<int>();

session.CreateQuery("delete Customer c where c.id in (:deleteIds)")
            .SetParameterList("deleteIds", deleteIds)
            .ExecuteUpdate();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...