代码之家  ›  专栏  ›  技术社区  ›  Brian Berns

nhibernate 3.0 linq针对<map>元素而不是使用hql进行查询

  •  2
  • Brian Berns  · 技术社区  · 14 年前

    我有一个这样的映射:

      <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.NotSupported例外: system.string获取项目(system.int32)

    有什么方法可以“教”nhibernate如何将这个c表达式转换成SQL吗?

    2 回复  |  直到 14 年前
        1
  •  2
  •   Diego Mijelshon    14 年前

    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):我的补丁已经合并到了主干中。现在支持此方案(您可以从源代码编译,或者等待几天以获得最终版本)

        2
  •  0
  •   Justin Soliz    14 年前

    nHibernate还使用createCriterials使查询变得非常简单。下面是一个例子:

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

    但是NHibernate也有一个LINQ供应商。我不确定是什么 Values[field.Key] 但这可能就是造成错误的原因。理想情况下,您应该选择一个“列”与“foo”进行比较。