【问题标题】:NHibernate 3.0 Linq query against <map> element instead of using HQLNHibernate 3.0 Linq 查询针对 <map> 元素而不是使用 HQL
【发布时间】:2010-12-04 12:10:37
【问题描述】:

我有一个如下所示的映射:

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

将其翻译成英语:记录将字段映射到值。在HQL中,我可以查询这个map,如下:

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?

【问题讨论】:

    标签: linq nhibernate map


    【解决方案1】:

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

    【讨论】:

    • 我会按照你的建议创建一张票。我查看了有关扩展 Linq 提供程序的信息,但我不知道如何实现 BuildHql 覆盖以使这种情况正常工作。有什么建议吗?
    • 我有一个概念验证工作;我会在这周的某个时候尝试上传补丁。
    • 太好了,谢谢。顺便说一句,这个查询的 HQL 版本存在一个严重的错误 (216.121.112.228/browse/NH-2415)。 Linq版本会不会有同样的问题?
    • 有可能。我希望它得到一些关注。
    • 我昨天上传了 NH-2416 的补丁。
    【解决方案2】:

    NHibernate 也使用 CreateCriteria 使查询变得非常简单。举个例子:

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

    但是 NHibernate 确实有一个也可以工作的 Linq 提供程序。我不确定Values[field.Key] 是什么,但这可能是引发错误的原因。理想情况下,您应该选择一个“列”来与“foo”进行比较。

    【讨论】:

    • 我认为 Criteria API 不支持 元素。这就是我目前使用 HQL 的原因。不过,Linq 解决方案会好得多。
    • 正如我所说,NHibernate 的 Linq 工作得非常好,尽管没有完美优化。 Values[field.Key] 是什么?我不禁认为在您的 .Where 方法中可以更好地进行比较。
    猜你喜欢
    • 1970-01-01
    • 2011-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-12
    • 1970-01-01
    相关资源
    最近更新 更多