我剛剛在我當前的項目中使用NHibernate(使用SQLite),我主要使用Query<>
,因爲我很熟悉在Linq中編寫db查詢。NHibernate Query <> vs QueryOver <>有什麼區別?
當我面對的是一些更復雜的查詢,我做了QueryOver<>
一些研究和揣摩,它應該在Query<>
受到青睞,因爲「QueryOver語法是NH具體的」。此外,Query<>
似乎沒有什麼能夠做到的,QueryOver<>
無法完成。
因此,我開始相應地更換Query<>
的所有用法。不久之前,我有第一個「問題」,使用Query<>
似乎更方便。 示例(選擇表格BillingDataEntity
從CustomNumber
列最高值):
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,而且查詢<>版本只是更容易閱讀。我得到的查詢完全錯誤,換句話說:有沒有更好的方法來做到這一點?
我看了一下生成的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進一步轉化爲實際數據庫查詢的「內部」(方法相關)查詢嗎?
我不確定你可以直接回答你的第一個問題,因爲我的答案指出QueryOver基於ICiteria,「這是你必須做的正確方式」。要查看生成的SQL,我會使用像NHProf這樣的商業工具,因爲它是最好的。不是直言不諱,HTH澄清了我給出的答案。 – Rippo 2013-02-22 11:14:04
謝謝,有一些有用的信息+1。 – 2013-02-22 11:24:16
另外,'Query'返回'IQueryable',它是一個'IEnumerable',所以它非常方便。 –
Jess
2014-11-06 14:19:41