2013-02-22 79 views
21

我剛剛在我當前的項目中使用NHibernate(使用SQLite),我主要使用Query<>,因爲我很熟悉在Linq中編寫db查詢。NHibernate Query <> vs QueryOver <>有什麼區別?

當我面對的是一些更復雜的查詢,我做了QueryOver<>一些研究和揣摩,它應該在Query<>受到青睞,因爲「QueryOver語法是NH具體的」。此外,Query<>似乎沒有什麼能夠做到的,QueryOver<>無法完成。

因此,我開始相應地更換Query<>的所有用法。不久之前,我有第一個「問題」,使用Query<>似乎更方便。 示例(選擇表格BillingDataEntityCustomNumber列最高值):

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進一步轉化爲實際數據庫查詢的「內部」(方法相關)查詢嗎?

回答

26

有很多#2但簡而言之關於QueryOver與查詢這裏的答案: -

QueryOver是標準的強類型版本,更 NHibernate的具體。幾乎任何你可以在ICriteria中做的事情都可以使用QueryOver完成 。在ICriteria NH2的黃金時段,你總是有 進行投射,因此這就是爲什麼現在你需要在 鏈的末尾投射回int。 (查詢)是一種標準的查詢方法,適用於IQueryable, 不需要顯式引用NHibernate,可以被認爲是 更多ORM不可知,因此遵循linq標準。正如你 正確地指出你不需要轉換爲int,因爲你在 中選擇了自定義編號。

如果生成的SQL非常不同,我會非常驚訝你的簡單例子。

我的QueryOver一個大風扇,但作爲LINQ提供日臻成熟,然後我查詢的95%,我用Query但對於一些NHibernate的具體的東西我訴諸回落到QueryOver。無論哪種方式,我建議使用分析工具,看看你能忍受。

參考文獻:Tradeoffsversusversus

+0

我不確定你可以直接回答你的第一個問題,因爲我的答案指出QueryOver基於ICiteria,「這是你必須做的正確方式」。要查看生成的SQL,我會使用像NHProf這樣的商業工具,因爲它是最好的。不是直言不諱,HTH澄清了我給出的答案。 – Rippo 2013-02-22 11:14:04

+0

謝謝,有一些有用的信息+1。 – 2013-02-22 11:24:16

+1

另外,'Query '返回'IQueryable',它是一個'IEnumerable',所以它非常方便。 – Jess 2014-11-06 14:19:41

3

關於您的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_ 

希望這會有幫助

相關問題