NHibernate 3.0 Linq查询<map>元素而不是使用HQL </map>

时间:2010-11-17 15:55:58

标签: linq nhibernate map

我的映射看起来像这样:

  <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?

2 个答案:

答案 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”进行比较。