Biegły NHibernate nie tworzy IN części klauzuli WHERE
Mam płynne kwerendy NHibernate Linq, w których sprawdzam wartości na podstawie tablic czasu wykonywania. Podstawowym przykładem może być coś takiego:
var array = [1,2,3,4,5,6];
using (var session = SessionProvider.SessionFactory.OpenSession())
{
return session.Query<MyObject>().Where(x => array.Contains(x.CompareVal)).ToList();
}
Spodziewałbym się, że wygenerowana instrukcja SQL będzie wyglądać mniej więcej tak:
SELECT CompareVal, Column1, Column2
FROM MyObject
WHERE CompareVal IN (1,2,3,4,5,6)
Jednak zamiast tego stwierdzam, że wygenerowana instrukcja SQL po prostu emituje klauzulę WHERE (sprawdzoną przez oglądanie w programie Profiler) i wybiera całą tabelę, a następnie wydaje się uruchamiać filtr w pamięci po odzyskaniu wszystkich danych.
Coś do odnotowania - mam klasę Repozytorium rodzajowe, przez którą przechodzą wszystkie te połączenia. Metoda zapytania jest następująca:
public IList<T> Query(Func<T, bool> criteria)
{
using (var session = SessionProvider.SessionFactory.OpenSession())
{
return session.Query<T>().Where(criteria).ToList();
}
}
Oczywiście to (brak klauzuli gdzie) jest niedopuszczalne w tabeli z dużą ilością danych. Co mogę zrobić, aby zmusić NHibernate do prawidłowego wygenerowania zapytania za pomocą klauzuli WHERE i nadal zachować ogólny wzór dla repozytoriów?