我正在使用以下代码创建报告(返回的对象列表用作rdlc文件中的数据源)。
我正在查询TNA对象列表,每个对象都可以包含一个Training对象列表。每个Training对象都可以包含Course对象。每个TNA对象都包含一个Employee对象。
但是,我发现代码需要很长时间才能运行。
此外,如果我们有超过几百个TNA对象,我们会在查询完成之前出现内存不足错误。
我对nHibernate没有太多经验 - 是否可以优化此代码或代码中是否存在明显错误?
提前致谢。
DetachedCriteria dc = this.BuildPermissions(moduleUser, typeof(TNA));
ICriteria criteria = dc.GetExecutableCriteria(this.Session);
criteria.Add(Restrictions.Eq("Id", id));
criteria.CreateAlias("TrainingRecords", "TrainingRecords", NHibernate.SqlCommand.JoinType.LeftOuterJoin);
criteria.Add(Restrictions.Not(Restrictions.Eq("TrainingRecords.TNAStatus", TNAStatus.Optional)));
ProjectionList projectionList =
Projections.ProjectionList()
.Add(Projections.Property("OrgUnit"), "OrgUnit")
.Add(Projections.Property("Employee"), "Employee")
.Add(Projections.Property("TrainingRecords.Course"), "Course")
.Add(Projections.Property("TrainingRecords.RequiredBy"), "RequiredBy")
.Add(Projections.Property("TNATemplate"), "TNATemplate")
.Add(Projections.Property("TrainingRecords.TNAStatus"), "TNAStatus")
.Add(Projections.Property("Customer"), "Customer");
ICriteria result = criteria.SetProjection(projectionList)
.SetResultTransformer(Transformers.AliasToBean<TrainingMatrix>());
return result.List<TrainingMatrix>();
答案 0 :(得分:0)
首先,请在nhibernate配置中添加.ShowSql并检查由nhibernate生成的sql语句。您可以将它放在SQL Managment Studio等中并查看性能。
第二,您可以使用SQL profiler等工具来检查数据库中发生的事情。
第三,请确保您在DB
中创建了正确的密钥和索引第四,检查你如何初始化你的sessionfactory。你是在每次创建新的sessionfactory吗?
第五,看你可以使用nhibernate的缓存。
第六,检查如何从报告中将程序称为数据源。寻找任何无限循环,数据源一次又一次地重复绑定等。
第七,如果不需要同时使用第二个表中的所有数据,而是根据投影,您可以使用延迟加载并根据需要获取对象