【发布时间】:2010-10-06 15:13:04
【问题描述】:
与使用 QueryOver 语法相比,我还没有发现 NHibernate 3.0 LINQ 提供程序所支持的内容的明确比较。从表面上看,这似乎是两个非常相似的事情的两个巨大的努力。
使用每种方法的关键权衡是什么?
【问题讨论】:
-
我很想看到一个很好的比较。
标签: linq nhibernate
与使用 QueryOver 语法相比,我还没有发现 NHibernate 3.0 LINQ 提供程序所支持的内容的明确比较。从表面上看,这似乎是两个非常相似的事情的两个巨大的努力。
使用每种方法的关键权衡是什么?
【问题讨论】:
标签: linq nhibernate
LINQ 和 QueryOver 是完全不同的查询方法,是在 NHibernate 2 (Criteria, HQL, SQL) 中添加的查询方法
QueryOver 是 Criteria 的强类型版本,并且支持几乎相同的构造,它们是 NHibernate 特有的。
LINQ 是一种“标准”查询方法,这意味着客户端代码可以在 IQueryable 上运行,而无需显式引用 NHibernate。它支持一组不同的结构;很难说是否比 QueryOver 有更多或更少。
我的建议是学习所有支持的查询方法,因为每个用例都不同,有些用例更好,有些用另一种更好。
【讨论】:
我同时使用了 NH-Linq-providers(2.1 版的旧 NHContrib,以及 NH3.0 的新版),还使用了 QueryOver。凭借在开发相当复杂的数据驱动应用程序期间获得的所有经验,如果您打算仅支持基本的 CRUD 操作,我强烈建议不要将现有的 linq-provider 与 nHibernate 一起使用!
当前的实现 (linq) 有时会产生非常不可读且效率低下的 SQL。如果您想优化数据库性能,尤其是快速连接一些表会成为一场噩梦。
尽管存在所有这些缺点,但我从未遇到过错误的查询。 因此,如果您不关心性能并且已经熟悉 LINQ,那么请选择 NH-Linq。否则 QueryOver 是您可靠且类型安全的朋友。
【讨论】:
Query 的一项任务耗时 10 秒。更改为QueryOver,没有任何其他更改:1s
LINQ to NHibernate(从 3.0 版开始)不支持 Nullable 类型的 .HasValue 属性。必须在查询中与 null 进行比较。
【讨论】:
我开始使用 NH-Linq,因为我已经完成了 LinqToSql 和实体框架。但是,对于更复杂的查询,我总是使用 QueryOver。原因:
【讨论】: