Как эффективно удалять данные в БД с помощью LinQ to NHibernate (one-shot-delete) - PullRequest
1 голос
/ 17 января 2011

Производя программное обеспечение для клиентов, в основном использующих MS SQL, но некоторые Oracle, было принято решение погрузиться в Nhibernate (и C #).

Задача состоит в том, чтобы эффективно удалить, например, 10 000 строк из 100 000, и при этом оставаться привязанными к ORM.

Я пробовал именованных запросов - ссылка уже,

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

Поскольку он может не попасть в дБ, чтобы получить все полные строки перед их удалением.

Мои вопросы:

Если есть лучший способ удаления этого типа.

Если есть возможность получить условие Где для удаления, например:
Наличие оператора select (с использованием LinQ для NHibernate) =>который сгенерирует соответствующий SQL для DB =>, мы получим условие Where и используем его для Delete.

Ответы [ 3 ]

1 голос
/ 17 января 2011

Если есть лучший способ удаления этого типа.

Да, вы могли бы использовать HQL вместо SQL .

Если есть возможность получить условие Где для удаления [используя выражения]:

Нет, AFAIK, это не реализовано. Поскольку NHibernate является проектом с открытым исходным кодом, я призываю вас выяснить, предлагал ли кто-нибудь этот и / или обсудить его в списке рассылки .

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

Там теперь лучше с 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);
0 голосов
/ 27 января 2011

Спасибо за ваш быстрый ответ. Теперь у меня, наверное, есть разница.

session.CreateSQLQuery(cmd).ExecuteUpdate();

должен иметь cmd с Delete From DbTable. Наоборот HQL способ

session.CreateQuery(cmd).ExecuteUpdate();

нужен cmd с Delete From MappedCollectionOfObjects.

В этом случае, возможно, это решит и мой другой вопрос.

...