次のクエリがあります。
MyRepository.Query<MyObject>().SingleOrDefault(x => x.AProperty == aValue);
正しい MyObject を返しますが、ますます時間がかかり始めています。SQL Server Profiler を調べたところ、MyObject および関連オブジェクトのデータベースから 1 行と 1 行を選択することで、すべての MyObjects がデータベースに読み込まれていることがわかりました。データベースが大きくなると、非常に単純なクエリに対して何千もの選択が行われるようになります。
一方、このクエリ:
Session.QueryOver<MyObject>().Where(x => x.AProperty == aValue).SingleOrDefault<MyObject>()
すべてをロードするわけではありません (数千ではなく単一の select ステートメントを作成します)。
なんで?すべてをロードしないようにクエリに指示する方法はありますか? それとも、これがLinqクエリの仕組みですか? 私が尋ねる理由は、すべてのクエリが Query を使用して作成されるアプリケーションを持っているからです。QueryOver に変更するには、多少の作業が必要です。何か案は?
いくつかの詳細:
- クエリは、NHibernate.Linq 名前空間 (NHibernate v 3.1.0.4000) の拡張メソッドです。
- FluentNHibernate の私のバージョンは 1.2.0.712 です
- 私はこの規則を持っています: Conventions.Add(FluentNHibernate.Conventions.Helpers.DefaultLazy.Never());