Прежде всего, я использую 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))
И работает очень быстро. Но я не могу понять, почему. Любые идеи?