我的映射看起来像这样:
<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中的新Linq提供程序而不是HQL重新创建此查询?我尝试了以下代码但没有成功:
var records = session.Query<Record>()
.Where(rec => rec.Values[field.Key] == "foo");
当NHibernate试图解释字典访问器时,这会产生错误:
System.NotSupportedException: System.String get_Item(System.Int32)
有没有办法“教”NHibernate如何将这个C#表达式转换为SQL?
答案 0 :(得分: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):我的补丁已合并到主干中。现在支持此方案(您可以从源代码编译,或者等待几天以获得最终版本)
答案 1 :(得分:0)
NHibernate也使用CreateCriteria使查询变得非常简单。下面是一个例子:
var records = session.CreateCriteria<Record>()
.Add(Restrictions.Eq("Key", "foo)
.List<Record>();
但是NHibernate确实有Linq提供程序可以运行。我不确定Values[field.Key]
是什么,但那可能是抛出错误。理想情况下,您应该选择“列”来与“foo”进行比较。