使用Fluent NHibernate检索大型数据集

时间:2011-09-01 16:12:18

标签: c# fluent-nhibernate

我正在构建一个解决方案,我从数据库中检索大量数据(5k到10k记录)。我们现有的数据访问层使用Fluent NHibernate,但我“害怕”我将通过保护代表数据库实体的对象模型来产生大量开销。

我可以只检索ADO数据集吗?

3 个答案:

答案 0 :(得分:3)

是的,你应该关注这个的表现。您可以查看使用NHibernate的IStatelessSession功能。但是,这可能无法为您提供所需的性能。虽然我从2.1.2GA开始就没有使用NH,但我发现在批量操作方面它们不太可能大大提高NH的性能。说白了,在批量操作方面,NH只是糟透了(大多数ORM都是这样)。

问:我可以只检索ADO数据集吗?

当然可以。仅仅因为你正在使用NHibernate并不意味着你不能新建一个ADO.NET连接并以原始方式命中数据库。

尽管我厌恶数据表和数据集,但您可能需要考虑使用它们,而不是添加映射/创建与10K行数据相关联的对象的开销。

答案 1 :(得分:1)

根据您需要的性能,有几个选项。使用sqldatareader没有什么比这更好的了,因为这就是每个.NET ORM实现的基础。除了速度最快之外,如果您不需要在查询后保存所有记录的列表,则可能会占用更少的内存。

至于你的表现担忧,5k-10k的记录不是那么高。我之前从nhibernate中抽出了一百多万行,但显然这些记录并不大,而且只针对一个案例。如果您在高流量网站上这样做,那么当然如果您遇到瓶颈,您必须更有效率。如果您正在考虑数据集,我建议改为Massive,因为它仍然比DataSet / Table更有效,更方便。

答案 2 :(得分:0)

您可以使用“标量查询”,实际上是本机SQL查询返回对象[]列表(每行一个对象[]):

sess.CreateSQLQuery("SELECT * FROM CATS")
 .AddScalar("ID", NHibernateUtil.Int64)
 .AddScalar("NAME", NHibernateUtil.String)
 .AddScalar("BIRTHDATE", NHibernateUtil.Date)

来自NHibernate文档的示例:http://nhibernate.info/doc/nh/en/index.html#d0e10794