NhibernateへのNiceジェネリックフレンドリーアクセスを作成する方法が2つあることに気づきました。
IQueryOver<T, T> query= session.QueryOver<T>().Where(criteria);
そして
IQueryable<T> query= session.Query<T>().Where(criteria);
各インターフェースの実装。
IQueryOver<TRoot, TSubType> : IQueryOver<TRoot>, IQueryOver
そして
IQueryable<out T> : IEnumerable<T>, IQueryable, IEnumerable
IQueryableはIEnumerableを実装しているため、期待するすべてのLINQフレンドリーなものをサポートします。私はこの実装を好む傾向がありますが、QueryOverの目的がQueryでは達成できないことを誰かが知っているかどうか疑問に思っていましたか?
QueryOver
は、拡張メソッドとラムダ式を組み合わせたものです。
IList<Cat> cats =
session.QueryOver<Cat>()
.Where(c => c.Name == "Max")
.List();
QueryOver
は、NHibernateのCriteriaAPIの上に構築された強い型のクエリテクノロジーです。
あなたはより多くの情報を読むことができます ここ と ここ 。
私の知る限り、linqプロバイダーの一部の機能はまだ実装されていません。
私はQueryOver
を使用します。
エレガントなコードを書くことができ、完全な機能を備えています。
価値のあるもの 読む 。
QueryOver構文はNHibernate固有であるため、LINQでは一致しない強力なメソッドが多数あります。
LeftyXが言ったように、NHのLINQ実装は完全ではなく、私はそれに関していくつかの頭痛の種を抱えていました。たとえば、最近、実装が不完全であるかバグが原因で、LINQで2次キャッシュ、Future値、NH Spatial拡張機能を使用する際に問題が発生しました(生成されたSQLのパフォーマンスについては言及していませんが、かなりひどい場合があります)。
これらすべての場合で、QueryOverを使用する必要があり、学習曲線を超えた後、IMHOはLINQよりもはるかに優れた構文です。
しかし、Queryを介したLINQにも利点があります。 ORMにとらわれない(よりクリーンなリポジトリアーキテクチャを活用する可能性がある)ようなものであり、単純なクエリの場合はそれで十分です。