与使用QueryOver语法相比,我没有找到与NHibernate 3.0 LINQ Provider支持的内容的明确比较。从表面上看,似乎有两个很大的努力分为两个非常相似的东西。
使用每种产品有哪些关键权衡?
答案 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。原因: