2010-04-12 35 views
0

我的情況是這樣的:我有一個基地NHibernate的查詢的形式來運行(我使用的DetachedCriteria編碼,但使用SQL語法在這裏形容它):在NHibernate的,我怎麼合併兩個實例的DetachedCriteria

SELECT * FROM Items I INNER JOIN SubItems S on S.FK = I.Key 

的用戶界面來顯示這個結果加入允許用戶指定附加標準:你說:

I.SomeField = 'UserValue'. 

現在,我需要最終負荷命令是:

SELECT * FROM Items I INNER JOIN SubItems S on S.FK = I.Key 
WHERE I.SomeField = 'UserValue' 

我的問題是:我用查詢的「靜態」方面創建了一個DetachedCriteria(頂部連接),UI創建了一個DetachedCriteria和查詢的'dynamic'組件。我需要將這兩者合併成一個可以在NHibernate會話中執行的最終查詢。

DefaultCriteria.Add()需要一個ICriterion(它是使用Expression類創建的,也可能是其他類,我不知道哪個可以解決我的問題)。

有誰知道我會怎麼做我想要的?

回答

1

您可以使用GetExecutableCriteria把一個分離的標準爲可執行格式特定會話:

var query = DetachedCriteria.For<...>(); 

using (var session = ...) 
using (var transaction = session.BeginTransaction()) 
{ 
    query.GetExecutableCriteria(session) 
    transaction.Commit(); 
} 

不過,我覺得你的設計是一個小缺陷。 UI應該補充標準,而不是創建它自己的標準。最壞的情況下,它應該生成ICriterion,然後在執行前添加到您的標準。充其量,您可以將過濾功能抽象爲完全獨立於您的ORM技術的圖層,然後將UI中的過濾器應用到您的基本標準。

+0

謝謝肯特。發佈問題後我得出了同樣的結論。 我已經改變了我的'UI'(其實際DTO工廠代碼,不是真正的用戶界面)來生成ICriterion。 關於把自己從ORM中分離出來的好處 - 我應該創建自己的標準來描述類,然後使用它們來生成合適的NHibernate標準。 – Trevor 2010-04-13 06:43:37

相關問題