EntityFramework性能问题

时间:2010-05-29 11:43:52

标签: c# winforms performance entity-framework

我正在使用EntityFrameowrk 4和WinForms。 我有一个DataGridView,显示5到12千条记录。记录来自不同级别的层次结构。有班级记录 A,B,C,D,其中A包含B的集合,B包含C等的集合。最多的类是D.在DataGridView中,此层次结构是扁平的,并且每个记录在行中显示有一些颜色/字体格式。为了做这种渲染,我编写了以下代码:

foreach (a in A)
{
   var displayObjectA = new DisplayObject()
   {
      Name = a.Name,
      Code = "Section", 
      Object = a  
   }
   data.Add(displayObjectA);

   var B = a.B;

   foreach (b in B)
   {
      var displayObjectB = new DisplayObject()
      {
         Name = b.Name,
         Code = "Subsection", 
         Object = b  
      }
      data.Add(displayObjectB);

      var C = b.C;

      foreach (c in C)
      {
         var displayObjectC = new DisplayObject()
         {
            Name = c.Name,
            Code = "Group", 
            Object = c 
         }
         data.Add(displayObjectC);

         var D = c.D; 
         foreach (d in D)
         {
            var displayObjectD = new DisplayObject()
            {
               Name = d.Name,
               Code = d.Code, 
               Object = d 
            }
            data.Add(displayObjectD);
         }
      }
   }
}

之后,数据将在DataGridView中显示出来。 问题是这种渲染花费的时间太长了。最耗时的部分似乎是行

foreach (d in D)

特别是对函数的调用

System.Data.Objects.DataClasses.EntityCollection<T>.GetEnumerator(). 

当我在Reflector中查看此函数时,它显示它的主体是空的。

我的问题是:

  1. 有没有更好的方法来进行此类渲染?
  2. 如何提高性能?
  3. 为什么GetEnumerator()为空?它是在运行时构建的吗?

1 个答案:

答案 0 :(得分:3)

  1. 使用Darin建议的分页。
  2. 确保使用.Include()加载所有内部集合,不要使用延迟加载。否则,对实体的子集合的每次访问都将向DB执行etxra请求。再次,使用分页。
  3. 您可能正在使用.NET 4并查看Program Files \ Reference Assemblies文件夹。这些只是包含元数据的空集合。真正的是在Windows \ Microsoft.NET中。或升级到Reflector 6.1,它能够处理两者之间的映射。