落后于ORM和现代数据访问的世界,我正在寻求从DataSet( shudder )转移到适当的映射框架。
我刚刚把我的头脑转向Linq to SQL,我现在正在研究NHibernate以便在我们的下一个项目中使用它。
使用旧的sql和数据集,您的SQL查询显然只返回您想要的数据。我也理解L2S也足够聪明地评估它的where子句,以便它只返回你请求的对象。 NHibernate是一样的吗? Ayende的Linq对NHibernate也一样吗?
我的意思是,如果我做的相当于:
Select * from customers where name = "fred"
它会将每个客户都提取到内存中,然后过滤掉非弗雷德,或者它是否足够聪明,只能在第一时间获得所需的内容?
如果它很聪明,有什么警告?是否有某些类型的查询无法以这种方式进行评估?我需要注意哪些性能问题?
由于
安德鲁
答案 0 :(得分:8)
快速回答是ORM将检查属性名称并将其转换为SQL查询,这将使您命名= ....因此它不会将所有客户加载到内存中以搜索名称
答案 1 :(得分:4)
Nhibernate提供了几种查询数据库的方法。 Hibernate使用类似Sql的语法,称为HQL,它是对象上的SQL。此外,它可以通过示例进行搜索,您可以在其中创建对象并填写所需的critea,然后hibernate将对象拉出具有相同属性值的DB。
看看这里它会让你加快速度summer of Nhibernate 2和2a会更深入地回答
HTH
骨
答案 2 :(得分:3)
如果您真的担心NHibernate生成什么查询,请运行SQL Server Profiler并找出正在运行的内容或配置它的日志记录并打开其SQL输出。它将显示配置其log4net的所有SQL语句。
答案 3 :(得分:1)
是的,NHibernate应该是那里性能最好的ORM之一,我在一个项目中使用过它非常酷。 关于LINQ to NHibernate you may want to check this article。 有一个学习曲线(NHQL和ICriteria),如果你想让跳跃起初很困难,那么所有投入的时间都会回到你身边。 希望这会有所帮助。
答案 4 :(得分:1)
NHibernate将为您的示例创建一个类似的查询,无论您使用的是HQL还是ICriteria,但它实际上会让您做得更好。它将创建一个参数化的sql语句,以便可以在SQL Server中缓存查询。
ICriteria非常灵活,但是要有一点学习曲线才能熟练掌握它。我也推荐夏天的nhibernate截屏,以便快速上手。
答案 5 :(得分:1)
使用NHibernate实现“企业”类性能有点简单。
基于对象中的属性和关系映射,ORM将为该获取构建特定查询。如果属性被标记为延迟加载,那么它将被排除,并且当在会话中访问属性时,后续获取将仅获得该丢失数据。因此,如果我们打开SQL分析器,翻译的查询就会像这样
Select cust.Address, cust.Email from customers cust where cust.Name = "fred"
同样重要的是查询的深度。我们可以使用HQL查询来限制返回的记录数(对大型数据集很重要),这些查询根据您的数据库提供程序对数据进行分页...只要它们与HQL解析器一起使用即可。您还可以在关系映射上设置FetchMode
或CollectionFetchMode
,这些映射将执行连接,以便在单个交互中从多个表中进行选择。
如果您使用的是SQL服务器,则可以启用sp_execsql,它将通过存储过程运行所有提取,以便快速提升性能。
有关更多信息,有一篇关于Code Project的精彩文章,详细介绍了如何在应用程序中提高NHibernate的性能。如果您使用面向服务的体系结构,延迟可能是一个大问题。查看this thread了解相关详细信息。
答案 6 :(得分:0)
Linq to SQL开发已被Linq to Entities删除。你也应该试一试。