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

时间:2010-10-06 15:13:05

标签: linq nhibernate

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

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

4 个答案:

答案 0 :(得分:36)

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

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

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

我的建议是学习所有支持的查询方法,因为每个用例都不同,有些工作效果更好,有些工作效果更好。

答案 1 :(得分:16)

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

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

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

答案 2 :(得分:15)

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

答案 3 :(得分:2)

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

  • 使用NH-Linq的查询无法按预期工作。我记不起来了,但是对于一些复杂的查询,它无法正常工作。似乎太年轻了。正如dlang在前面的回答中所说,它产生了无效的SQL。
  • 当你学习QueryOver时,很容易调用函数,做投影,子查询,在NH-Linq看来更容易。
  • NH-Linq的好处 - 它可以扩展,就像Fabio Maulo解释here一样。但是,与QueryOver类似,但与NH-Linq不太相似:)