【问题标题】:NHibernate3 Query vs QueryOver [duplicate]NHibernate3 Query vs QueryOver [重复]
【发布时间】:2011-07-16 18:14:49
【问题描述】:

我注意到有两种方法可以创建对 nhibernate 的通用友好访问。

IQueryOver<T, T> query= session.QueryOver<T>().Where(criteria);

IQueryable<T> query= session.Query<T>().Where(criteria);

每个接口的实现。

IQueryOver<TRoot, TSubType> : IQueryOver<TRoot>, IQueryOver

IQueryable<out T> : IEnumerable<T>, IQueryable, IEnumerable

IQueryable 实现了 IEnumerable,因此支持您期望的所有 LINQ 友好的东西。我倾向于这种实现,但想知道是否有人知道 QueryOver 的目的是您无法使用 Query 完成的?

【问题讨论】:

  • 是的,你是对的。尽管权衡取舍的细节并不多。

标签: c# nhibernate orm


【解决方案1】:

QueryOver 结合了扩展方法和 lambda 表达式:

IList<Cat> cats =
    session.QueryOver<Cat>()
        .Where(c => c.Name == "Max")
        .List();

QueryOver 是一种建立在 NHibernate 的 Criteria API 之上的强类型查询技术。

您可以阅读更多信息 herehere

据我所知,linq 提供程序中的某些功能尚未实现。
我会使用QueryOver
它允许您编写优雅的代码,并且功能齐全。

值得reading

【讨论】:

    【解决方案2】:

    QueryOver 语法是 NHibernate 特有的,因此它有很多强大的方法,你在 LINQ 中是无法比拟的。

    正如 LeftyX 所说,NH 的 LINQ 实现并不完整,我曾为它感到头疼。例如,最近我在使用 LINQ 的 2 级缓存、Future 值和 NH 空间扩展时遇到了问题,所有这些都是由于不完整的实现或错误(更不用说某些生成的 SQL 的性能,这有时非常糟糕)。

    在所有这些情况下,我都必须使用 QueryOver,并且在超越学习曲线之后,恕我直言,这是一种比 LINQ 更好的语法。

    但是通过Query的LINQ也有优势;就像与 ORM 无关(这可能会利用更干净的存储库架构),对于简单的查询来说已经绰绰有余了。

    【讨论】:

      猜你喜欢
      • 2018-09-13
      • 2012-09-24
      • 1970-01-01
      • 2018-08-02
      • 1970-01-01
      • 2017-03-17
      • 1970-01-01
      • 2011-06-07
      • 2011-02-07
      相关资源
      最近更新 更多