2014-07-22 71 views
0

我正在使用下面的代码来创建一个报告(返回的对象列表被用作rdlc文件中的数据源)。在nHibernate中优化查询

我在查询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

首先,请在nhibernate配置中添加.ShowSql,并检查由nhibernate生成的sql语句。你可以把它放在SQL管理工作室等,看看性能。

第二,您可以使用SQL探查器之类的工具来检查数据库中发生了什么。

第三,请确保您有DB

第四创建适当的键和索引,检查你如何初始化SessionFactory的。你是否每次创建新的sessionfactory

第五,请参阅您可以使用nhibernate的缓存。

第六,检查如何从报表中调用程序作为数据源。寻找任何无限循环,重复数据源连连结合等

第七,如果不需要从第二表中的所有数据一次,而不是在预测,你可以使用延迟加载,并得到需要的基础上的对象

+0

不幸的是,我已经完成了大部分这些步骤,并且我需要一次完成所有数据。问题似乎是返回的对象的数量 - 数千个 - 这似乎导致内存不足错误。 – Matt