2010-11-17 85 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