【问题标题】:Implementing criteria for unsupported methods为不受支持的方法实施标准
【发布时间】:2013-02-19 23:50:25
【问题描述】:

我编写了一个使用 LINQ to NHibernate 进行数据库查询的应用程序。我的领域层中的代码创建了

类型的表达式
System.Linq.Expressions.Expression<Func<T, bool>>

这些被传递到我的数据访问层中的存储库,然后像这样使用它们:

return session.Query<T>.Where(expression)...

在我发现 NHibernate LINQ 提供程序完全忽略映射文件中的选项 fetch="join" 之前,这一切都很棒,这意味着使用多个选择语句而不是使用连接的单个选择来获取对象。

所以我正在尝试使用完全支持联接的 QueryOver API。我立即遇到了不支持 string.Equals 之类的方法的问题。我还有几个在我的表达式中使用的自定义扩展方法,为此我通过扩展 BaseHqlGeneratorForMethod 添加了对 LINQ to NHibernate 的支持。

如何在 QueryOver API 中添加对这些方法的支持?我找不到这方面的任何信息。

我知道你可以这样做:

Session.QueryOver<T>().WhereRestrictionOn(x=>x.Foo).IsInsensitiveLike("bar")

但我正在寻找一种方法来使用与 LINQ to NHibernate 相同的表达式来完成所有操作。

【问题讨论】:

  • 将lazy="false" 添加到 fetch="join",它应该适用于 LINQ 2 NH
  • 你确定吗?我正在使用 NHibernate 3.3 并在我的映射中有lazy="false" fetch="join",但它使用多个选择语句进行获取。如果我调用 session.Get(id),它将使用带有连接的单个 select 语句,但在我调用 session.Query() 时不会。
  • Linq2NH 是 linq 提供者。 QueryOver 不是另一个 linq 提供者,它只是使用 lambda 表达式来引用模型的属性。
  • 在使用Query&lt;T&gt;()时,关联有过滤条件吗?
  • @Dominic 我认为它只支持非常有限的一组表达式,例如t =&gt; t.Name == someVariable

标签: c# .net nhibernate queryover nhibernate-criteria


【解决方案1】:

答案似乎是无法将 lambda 表达式与 QueryOver API 一起使用。正如 Oskar 在对该问题的评论中指出的那样,仅支持非常简单的 lambda 表达式。我正在重写我的代码,以便存储库方法接收查询对象而不是 lambda 表达式。

【讨论】:

    猜你喜欢
    • 2012-01-20
    • 2011-02-07
    • 2012-10-18
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 2015-04-30
    • 2017-04-21
    相关资源
    最近更新 更多