web-dev-qa-db-ja.com

NHibernate3クエリとQueryOver

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では達成できないことを誰かが知っているかどうか疑問に思っていましたか?

27
Ty.

QueryOverは、拡張メソッドとラムダ式を組み合わせたものです。

IList<Cat> cats =
    session.QueryOver<Cat>()
        .Where(c => c.Name == "Max")
        .List();

QueryOverは、NHibernateのCriteriaAPIの上に構築された強い型のクエリテクノロジーです。

あなたはより多くの情報を読むことができます ここここ

私の知る限り、linqプロバイダーの一部の機能はまだ実装されていません。
私はQueryOverを使用します。
エレガントなコードを書くことができ、完全な機能を備えています。

価値のあるもの 読む

30
LeftyX

QueryOver構文はNHibernate固有であるため、LINQでは一致しない強力なメソッドが多数あります。

LeftyXが言ったように、NHのLINQ実装は完全ではなく、私はそれに関していくつかの頭痛の種を抱えていました。たとえば、最近、実装が不完全であるかバグが原因で、LINQで2次キャッシュ、Future値、NH Spatial拡張機能を使用する際に問題が発生しました(生成されたSQLのパフォーマンスについては言及していませんが、かなりひどい場合があります)。

これらすべての場合で、QueryOverを使用する必要があり、学習曲線を超えた後、IMHOはLINQよりもはるかに優れた構文です。

しかし、Queryを介したLINQにも利点があります。 ORMにとらわれない(よりクリーンなリポジトリアーキテクチャを活用する可能性がある)ようなものであり、単純なクエリの場合はそれで十分です。

15
psousa