2012-11-20 128 views
1

我昨天試過這個問題,但我認爲我的措辭不是很清楚。將SQL語句轉換爲NHibernate查詢

因此,我試圖重新說明下面的問題。

我們有一個現有的系統,我們在MVC4中重寫,我們在我們的新系統中使用NHibernate 3.2。

在舊系統中,我們建立了一個類似的SQL語句:

SELECT myField as series, 
    pstatus, 
    Year(acc_date) AS year, 
    Month(acc_date) AS month, 
    COUNT(CAST(reportable AS INT)) AS totalreportable, 
    SUM(CAST(reportable AS INT)) AS riddorreportable, 
    SUM(CAST(lt_acc AS INT)) AS losttime, 
    SUM(CAST(acc_losttime AS INT)) AS totaldayslost, 
    SUM(CAST(nearmiss AS INT)) AS nearmiss 
    FROM incident 
    WHERE 1=1 

在上面,我們將取代「WHERE 1 = 1」與NHibernate標準(我們已經有在系統過濾數據)。

上述SQL語句中的myField是可由用戶選擇的字段,例如,他可以選擇Department,City等。

因此,我需要的是如何使用nHibernate實現與上述SQL語句相同的結果的信息。

+0

我把看看你以前問過的問題(http://stackoverflow.com/questions/13457735/nhibernate-group-by-and-order-by-with-dynamic-field-selection)試圖更好地瞭解你正在努力實現,但它仍然有點不清楚,因爲你提到where子句現在使用NHibernate Criteria引發了我的興趣。你是說你使用ICriteria查詢API來構建WHERE子句嗎?此外,當您聲明允許用戶選擇特定列時,該列是否也用於WHERE子句中或僅在SELECT中使用? –

+0

嗨蘭迪 - 是的,我們正在建立一個新的系統,它必須模擬現有系統的功能。 WHERE子句可以包含選定的字段 - 從某種意義上說,WHERE子句的含義並不重要。新系統使用ICriteria查詢API來構建WHERE子句。 – Matt

回答

3

由於您已經在使用ICriteria API來構造WHERE子句,因此需要使用ICriteria的SetProjection()方法來構建動態SELECT子句。

這將允許您通過使用字符串以動態方式使用用戶的選定字段。

我會寫代碼的例子,但我覺得有人已經做了它一個很好的工作在這個其他的StackOverflow問題:https://stackoverflow.com/a/696020/670028

上的ICriteria預測官方NHibernate的文檔:http://nhibernate.info/doc/nh/en/index.html#querycriteria-projection

0

第14章,15,16和17的文檔在不同的查詢的API: http://nhibernate.info/doc/nh/en/index.html

除了這些也有一部分LINQ,這在當今也許應該是你的首選查詢API,除非支持你遇到了限制。如果你正在構建一個新系統,你應該從NH 3.3.2開始,以獲得最新的LINQ改進。

所有查詢API都可以根據某些用戶輸入來選擇(項目)不同的屬性。我認爲您可能需要更具體地瞭解您所嘗試的內容或您遇到的問題以獲得更詳細的回覆。