ランタイム配列に基づいて値をチェックするFluentNHibernateLinqクエリがあります。基本的な例は次のようになります。
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();
}
生成されたSQLステートメントは次のようになると思います。
SELECT CompareVal, Column1, Column2
FROM MyObject
WHERE CompareVal IN (1,2,3,4,5,6)
ただし、代わりに私が見つけたのは、生成されたSQLステートメントがWHERE句(プロファイラーで監視することで証明された)を発行し、テーブル全体を選択し、すべてのデータを取得するとメモリ内でフィルターを実行しているように見えることです。
注意点-私には、これらすべての呼び出しが行われるGenericRepositoryクラスがあります。Queryメソッドは次のとおりです。
public IList<T> Query(Func<T, bool> criteria)
{
using (var session = SessionProvider.SessionFactory.OpenSession())
{
return session.Query<T>().Where(criteria).ToList();
}
}
明らかに、これ(where句の欠如)は、大量のデータを含むテーブルでは受け入れられません。NHibernateがWHERE句を使用してクエリを正しく生成し、リポジトリの一般的なパターンを維持するように強制するにはどうすればよいですか?