37

私は現在のプロジェクトでNHibernate(SQLiteを使用)を始めたばかりでQuery<>、Linqでdbクエリを作成することに慣れていたため、主にを使用しました。

より複雑なクエリに直面したとき、私はいくつかの調査を行い、 「QueryOver構文はNH固有である」ためQueryOver<>、それを優先する必要があると考えました。また、成し遂げられないことができることは何もないようです。Query<>Query<>QueryOver<>

だから私はそれにQuery<>応じてすべての使用法を置き換え始めました。私が最初の「問題」を抱えるのはそう長くはかからなかったQuery<>CustomNumber例(表の列から最大値を選択BillingDataEntity):

int result = Session.Query<BillingDataEntity>().Select(x => x.CustomNumber).OrderByDescending(a => a).FirstOrDefault();
int result = Session.QueryOver<BillingDataEntity>().Select(x => x.CustomNumber).OrderBy(a => a.CustomNumber).Desc.Take(1).SingleOrDefault<int>();

私が嫌いなのは、結果を明示的にintにキャストする必要があることと、Query<>バージョンの方が読みやすいことです。私はクエリを完全に間違っていますか、言い換えれば、それを行うためのより良い方法はありますか?

生成されたSQL出力を確認しました。

NHibernate: select billingdat0_.CustomNumber as col_0_0_ from "BillingDataEntity" billingdat0_ order by billingdat0_.CustomNumber desc limit 1
NHibernate: SELECT this_.CustomNumber as y0_ FROM "BillingDataEntity" this_ ORDER BY this_.CustomNumber desc limit @p0;@p0 = 1 [Type: Int32 (0)]

私は正確に何を見ていますか?これは、NHibernateが実際のデータベースクエリにさらに変換する「内部」(メソッド依存)クエリですか?

4

2 に答える 2

41

StackoverflowにはQueryOverとQueryに関する回答がたくさんありますが、簡単に言うと:-

QueryOverは、厳密に型指定されたバージョンのCriteriaであり、NHibernate固有のものです。ICriteriaで実行できるほとんどすべてのことは、QueryOverを使用して実行できます。ICriteria NH2の黄金時代には、常にキャストする必要がありました。そのため、チェーンの最後でintにキャストする必要があるのはこのためです。

LINQ(クエリ)は、NHibernateへの明示的な参照を必要としないIQueryableで機能する標準のクエリメソッドであり、ORMに依存しないと見なすことができるため、linq標準に従います。正しく指摘したように、customNumberを結果に選択するときに、intにキャストする必要はありません。

生成されたSQLが非常に異なっていた場合、私はあなたの簡単な例に非常に驚かれることでしょう。

私は大ファンでしQueryOverたが、Linqプロバイダーが成熟するにつれて、クエリの95%を使用しますQueryが、Nhibernate固有のものについてはに頼りQueryOverます。いずれにせよ、プロファイリングツールを使用して、何ができるかを確認することをお勧めします。

参照:トレードオフまたはおよび

于 2013-02-22T10:54:04.917 に答える
2

あなたのQueryOverバージョンについて、私は次のように書いたでしょう:

int result = Session.QueryOver<BillingDataEntity>()
               .Select(Projections.Max<BillingDataEntity>(x => x.CustomNumber))
               .SingleOrDefault<int>();

非常に読みやすいようで、結果のSQLは次のようになります。

SELECT max(this_.CustomNumber) as y0_ FROM "BillingDataEntity" this_

これがお役に立てば幸いです

于 2013-02-22T17:02:33.877 に答える