2010-05-29 56 views
0

我正在使用EntityFrameowrk 4和WinForms。 我有一個DataGridView顯示5到12千條記錄。記錄來自不同層次的層次結構。有類 A,B,C,D的記錄,其中A包含B的集合,B包含C的集合等。最多的類是D.在DataGridView中,此層次結構被展平並顯示每條記錄在一些顏色/字體格式的行中。做這類渲染我寫了下面的代碼:EntityFramework性能問題

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 dispayed。 問題是,這種渲染花費的時間太長。並消耗部分時間最多的似乎是行

foreach (d in D) 
特別

調用一個函數

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

當我看着在反射板的功能,這表明它的機身是空的。

我的問題是:

  1. 有沒有更好的方式來做到這類型的渲染?
  2. 如何提高性能?
  3. 爲什麼GetEnumerator()是空的?它是在運行時構建的嗎?
+3

* 5至12千條記錄*?使用分頁。爲什麼在屏幕上只顯示最後只有10-20個記錄時會記錄如此多的記錄? – 2010-05-29 11:46:05

+0

這就是我問客戶的問題。但他要求所有的記錄都會被提取。 – Max 2010-05-29 14:50:55

回答

3
  1. 使用分頁如Darin建議。
  2. 確保使用.Include()加載所有內部集合,並且不要使用延遲加載。否則,對實體的子集合的每次訪問都將向數據庫執行etxra請求。並再次使用分頁。
  3. 您可能正在使用.NET 4並查看Program Files \ Reference Assemblies文件夾。這些只是包含元數據的空組件。真正的是在Windows \ Microsoft.NET中。或者升級到Reflector 6.1,它能夠處理兩者之間的映射。