Nhibernate-queryover-queries
NHibernate-QueryOverクエリ
この章では、QueryOverクエリについて説明します。 次のクエリに示すように、メソッドチェーン構文を使用したLINQに似た新しい構文です。
- それはまだ隠れた基準ですが、今ではクエリは強く型付けされています。
- 基準クエリで見たように、最初の名前は単なる不透明な文字列であり、実際には x.FirstName を使用しているため、最初の名前はリファクタリングされ、名前が変更されます。クエリオーバー。
- 似たようなことはまだたくさんできますが、クエリの理解構文をクエリオーバーで使用することはできません。メソッドチェーン構文を使用する必要があり、リンクと条件を組み合わせて一致させることはできません。
- 多くのクエリでは、APIを介したクエリは非常に便利で、Criteriaを直接使用するよりもオブジェクトの構文を理解するのがはるかに簡単です。
クエリオーバーを使用して、名前がLaverneである顧客を取得する簡単な例を見てみましょう。
お分かりのように、それはまだカバーの下の基準ですが、より良い構文です。
上記のコードをコンパイルして実行すると、次の出力が表示されます。
欠点の1つは、次のプログラムに示すように、* FirstName.StartsWith(“ A”)*と言いたいことです。
アプリケーションを再度実行してみましょう。この StartsWith メソッドがわからないため、これはLINQプロバイダーではないことがわかります。したがって、* RunTime例外*が発生します。
例外は、認識されないメソッド呼び出しを示しています。 ここでは明らかなことを行っていますが、必ずしも機能するとは限りません。
次のコードに示すように、FirstNameが「A%」に等しいなど、他のことを試してみましょう。
もう一度実行してみましょう。次のように結果が返されないことがわかります。
結果が得られない理由を理解するために、NHibernateプロファイラーを見てみましょう。
ご覧のとおり、名はA%に等しく、そうではありません。 A%は、like演算子を使用したSQLで使用されます。 次のプログラムに示すように、WHERE句に制限を作成する必要があります。
アプリケーションを再度実行してみましょう。すべての顧客が、Aで始まる名で取得されていることがわかります。
この新しい QueryOver 構文を使用することを除いて、以前と同じように機能します。 多くの開発者は、LINQ構文がより親しみやすく、多くの場合正しいことを行うことを認識しています。
LINQで処理できない場合は、HQLまたは基準を調べて、それがより適切かどうかを確認します。
異なる構文を提供するだけなので、作成基準とQueryOverの両方の基準は、NHibernateを使用してデータベースからデータを引き出すことができるさらに別のクエリメカニズムを提供します。