NHibernate зависает при отложенной загрузке запроса

Прежде всего, я использую Fluent NHibernate с LinqToNHibernate.

У меня есть запрос на поиск в таблице на основе данных, введенных пользователем. Так, например, я делаю что-то вроде этого:

        'build the initial query that we will filter--this is lazy loaded
    Dim results As IEnumerable(Of Customers) = Me.GetCustomers()

    'filter by owner name
    If String.IsNullOrEmpty(OwnerName) = False Then
        results = results.Where(Function(s) s.Name.Contains(OwnerName))            
    End If

    'execute query
    results = results.ToList()

По сути, я строю оператор where на операторе sql, если пользователь хочет искать по имени. Я использую все ленивые конфигурации в своих сопоставлениях, поэтому запрос не должен извлекать элементы до тех пор, пока не будет вызван "ToList()". Проблема в том, что NHibernate зависает на этом утверждении. Сначала я подумал, что это из-за того, что в БД было так много записей (около 500 000).

Но я изменил строку, где я фильтрую результаты, на это:

results = SessionFactoryProvider.SessionFactory.CurrentSession.Linq(Of Customer).Where(Function(c) c.Name.Contains(OwnerName))

И работает очень быстро. Но я не могу понять, почему. Любые идеи?


person Austin    schedule 14.12.2009    source источник


Ответы (1)


В первом случае вы извлекаете все записи и используете Linq-to-objects для фильтрации этого списка.

Во втором случае вы отправляете запрос в базу данных (NHibernate.Linq преобразует ваше выражение в предложение SQL WHERE).

Теперь я не знаю, какой тип возвращает GetCustomers, но, поскольку вы сохраняете его в IEnumerable (Of Customer), .NET не имеет возможности узнать о базовом поставщике. Если код GetCustomers выглядит примерно так:

Return CurrentSession.Linq(Of Customer)

... Тогда проблема в этом преобразовании. Просто измените первую строку на:

Dim results As IQueryable(Of Customers) = Me.GetCustomers()
person Diego Mijelshon    schedule 14.12.2009
comment
Спасибо; это сработало отлично :) Я думаю, что моя проблема заключалась в том, что мой возвращаемый тип был IEnumerable в первой строке вместо IQueryable. буду знать в будущем. - person Austin; 15.12.2009