使用NHibernate 3.0 QueryOver或LINQ提供程序进行权衡

dot*_*osh 44 linq nhibernate

与使用QueryOver语法相比,我没有找到与NHibernate 3.0 LINQ Provider支持的内容的明确比较.从表面上看,似乎有两个很大的努力分为两个非常相似的东西.

使用每种产品有哪些关键的权衡取舍?

Die*_*hon 36

LINQ和QueryOver是完全不同的查询方法,它们被添加到NHibernate 2中存在的那些(Criteria,HQL,SQL)

QueryOver是Criteria的强类型版本,主要支持相同的NHibernate构造.

LINQ是一种"标准"查询方法,这意味着客户端代码可以在没有显式引用NHibernate的情况下使用IQueryable.它支持一组不同的结构; 很难说是否有更多或更少的QueryOver.

我的建议是学习所有支持的查询方法,因为每个用例都是不同的,有些用一个更好用,有些用其他用得更好.

  • 例如,LINQ还不支持左连接. (8认同)
  • @Stefan:不,其实不是.尽管新提供商远远好于旧提供商(实际上很差),但它仍远未完成.实际上,在NH3发布之前已经进行了一些讨论,LINQ支持应该被称为"Beta" - 有充分理由这样做.然而,Fabio Maulo似乎决定不再称之为它 - 一个不完整的测试版. (4认同)
  • NH的linq实际上不是基于条件/ QueryOver吗?Linq不可能有更多的功能.它只能少. (3认同)
  • 在我看来,连接的Linq语法非常难看并导致无法读取的代码.我之所以使用Criteria API和QueryOver. (2认同)

Dan*_*ang 16

我已经使用了NH-Linq-providers(旧的NHContrib for Version 2.1,以及NH3.0的新版本),还使用了QueryOver.凭借在非常复杂的数据驱动应用程序开发过程中获得的所有经验,我强烈建议如果您计划仅仅支持基本的CRUD操作,则不要将现有的linq-provider与nHibernate一起使用!

当前的实现(linq)有时会产生非常难以理解且效率低下的SQL.如果您想优化数据库性能,特别是快速加入某些表会成为一场噩梦.

尽管存在所有这些缺点,但我从未遇到过错误的查询.因此,如果您不关心性能并且已经熟悉LINQ,那么请转到NH-Linq.否则,QueryOver是您可靠和类型安全的朋友.

  • 一个真实的例子:一项带有“查询”的任务需要 10 秒。更改为 `QueryOver` 没有任何其他更改:1s (2认同)

Mar*_*cel 15

LINQ to NHibernate(从3.0版开始)不支持Nullable类型的.HasValue属性.必须在查询中与null进行比较.