优化nHibernate中的查询

时间:2014-07-22 08:34:28

标签: c# asp.net-mvc-3 nhibernate reporting-services

我正在使用以下代码创建报告(返回的对象列表用作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>();

1 个答案:

答案 0 :(得分:0)

首先,请在nhibernate配置中添加.ShowSql并检查由nhibernate生成的sql语句。您可以将它放在SQL Managment Studio等中并查看性能。

第二,您可以使用SQL profiler等工具来检查数据库中发生的事情。

第三,请确保您在DB

中创建了正确的密钥和索引

第四,检查你如何初始化你的sessionfactory。你是在每次创建新的sessionfactory吗?

第五,看你可以使用nhibernate的缓存。

第六,检查如何从报告中将程序称为数据源。寻找任何无限循环,数据源一次又一次地重复绑定等。

第七,如果不需要同时使用第二个表中的所有数据,而是根据投影,您可以使用延迟加载并根据需要获取对象