权衡使用NHibernate 3.0 QueryOver或LINQ提供商

我还没有find与使用QueryOver语法相比NHibernate 3.0 LINQ提供程序支持的明确比较。 从表面上看,这似乎是两个非常类似的事情的两大努力。

什么是使用每个关键的权衡?

LINQ和QueryOver是完全不同的查询方法,添加到NHibernate 2(Criteria,HQL,SQL)

QueryOver的意思是一个强types的Criteria版本,并且支持大部分相同的构造,它们是NHibernate特有的。

LINQ是一个“标准”查询方法,这意味着客户端代码可以在没有明确引用NHibernate的情况下在IQueryable上工作。 它支持一组不同的构造; 如果QueryOver有更多或更less的话,这将是很难说的。

我的build议是学习所有支持的查询方法,因为每个用例是不同的,一些更好地与一个,一些更好地与其他。

我已经使用NH-Linq提供者(旧的NHContrib for 2.1版,也是NH3.0的新版本),还使用了QueryOver。 有了开发相当复杂的数据驱动应用程序的所有经验,我强烈build议不要在nHibernate中使用现有的linq提供程序,如果你打算只落后于基本的CRUD操作的话!

当前的实现(linq)有时会产生真正难以读取且效率不高的SQL。 如果要优化数据库性能,特别是join某些表格很快就会变成一场噩梦。

尽pipe所有这些缺点,我从来没有遇到错误的查询。 所以,如果你不关心性能,并已经熟悉LINQ,那么去NH-Linq。 否则QueryOver是你的可靠和types安全的朋友。

LINQ to NHibernate(从版本3.0开始)不支持Nullabletypes的.HasValue属性。 在查询中必须比较null。

我开始使用NH-Linq,因为我已经完成了LinqToSql和Entity Framework。 但是,对于更复杂的查询,我总是使用QueryOver完成。 原因:

  • 这发生与NH-Linq查询不能按预期工作。 我不记得确切,但它不适用于一些复杂的查询。 看起来太年轻了。 正如dlang在之前的回答中所说的,它会产生不够高效的SQL。
  • 当你学习QueryOver时,很容易调用函数,做投影,子查询,在我看来NH-Linq更容易。
  • NH-Linq好东西 – 可以延长,就像Fabio Maulo 在这里解释的那样。 但是,与QueryOver类似的是相当可能的,但不像NH-Linq那样花哨:)