Проблема производительности EntityFramework - PullRequest
0 голосов
/ 29 мая 2010

Я использую 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 Ответ

3 голосов
/ 29 мая 2010
  1. Используйте пейджинг, как предложил Дарин.
  2. Убедитесь, что вы загружаете все внутренние коллекции с помощью .Include() и не используете отложенную загрузку. В противном случае каждый доступ к дочерней коллекции сущности будет выполнять запрос etxra к БД. И снова используйте пейджинг.
  3. Вы, вероятно, используете .NET 4 и просматриваете папку Program Files \ Reference Assemblies. Это просто пустые сборки, содержащие только метаданные. Реальные находятся в Windows \ Microsoft.NET. Или обновите до Reflector 6.1, который может обрабатывать сопоставление между ними.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...