2010-11-17 18 views
2

Linq查詢我有一個映射,看起來像這樣:NHibernate的3.0對<map>元素,而不是使用HQL

<class name="Record"> 
    <map name="Values"> 
     <key column="RecordFK"/> 
     <index column="FieldFK"/> 
     <element column="Value"/> 
    </map> 
    </class> 

翻譯這英語:一個記錄域映射到值。在HQL,我可以查詢這個圖,如下:

from Record rec where rec.Values[:fieldFK] = :value 

是否有可能重新使用NHibernate的3.0,而不是HQL新LINQ提供此查詢?我嘗試下面的代碼沒有成功:

var records = session.Query<Record>() 
        .Where(rec => rec.Values[field.Key] == "foo"); 

此時的NHibernate試圖解釋詞典存取產生的誤差:

System.NotSupportedException: System.String get_Item(System.Int32)

有什麼方法可以「教」NHibernate如何將此C#表達式轉換爲SQL?

回答

2

NHibernate的3確實有一種方法來擴展供應商,讓更多的表情,檢查http://fabiomaulo.blogspot.com/2010/07/nhibernate-linq-provider-extension.html

然而,這看起來喜歡的事,應該得到支持。我的建議是,你在http://jira.nhforge.org上創建了一張失敗的測試用例。

如果您想多做一點,可以潛入https://nhibernate.svn.sourceforge.net/svnroot/nhibernate/trunk/nhibernate/src/NHibernate/Linq並創建一個補丁。這會讓事情變得更快。

更新(2010-12-04):我的補丁已被合併到主幹中。現在支持這種情況(您可以從源代碼編譯,或等待最後版本幾天)

+0

我會根據你的建議創建一張票。我查看了關於擴展Linq提供程序的信息,並且我不知道如何實現BuildHql重寫以使此案例有效。有什麼建議麼? – brianberns 2010-11-17 19:08:14

+0

這是我創建的票:http://216.121.112.228/browse/NH-2416 – brianberns 2010-11-17 19:21:15

+0

我有一個概念證明工作;本週我會嘗試上傳一個補丁程序。 – 2010-11-17 21:25:49

0

NHibernate使查詢非常簡單,使用CreateCriteria。下面是一個例子:

var records = session.CreateCriteria<Record>() 
        .Add(Restrictions.Eq("Key", "foo) 
        .List<Record>(); 

但NHibernate確實有一個Linq提供程序也可以。我不知道什麼Values[field.Key],但那可能是什麼拋出的錯誤。理想情況下,你應該選擇一個「列」來比較「富」。

+0

我不認爲Criteria API支持元素。這就是我目前使用HQL的原因。不過,Linq解決方案會更好。 – brianberns 2010-11-17 16:21:25

+0

正如我所說NHibernate的Linq工作得很好,儘管沒有完美優化。什麼是「值[field.Key]」?我不能幫助,但認爲在你的'.Where'方法中比較好。 – 2010-11-17 17:35:11

相關問題