Как сначала перебрать дочерний список объектов в коде Entity Framework 4.1 - PullRequest
1 голос
/ 05 октября 2011

Я использую Entity Framework 4.1 code first.

Вот мой Category класс:

public class Category
{
     public int Id { get; set; }
     public string Name { get; set; }
     public bool IsActive { get; set; }
     public int? ParentCategoryId { get; set; }
     public virtual Category ParentCategory { get; set; }
     public virtual ICollection<Category> ChildCategories { get; set; }
}

Приведенный выше класс является категорией с самообращением, например, родительская категория можетУ меня есть список дочерних категорий.

Я хочу создать строковое значение имени родительской категории и имени дочерней категории, например, Parent Category 1 > Child Category 1-1.

Итак, я получаю списоквсе родительские категории, цикл по каждой родительской категории.И для каждой родительской категории я хочу пройтись по списку дочерних категорий и объединить имя каждой дочерней категории с именем родительской категории, чтобы у меня было что-то вроде:

Animal > Lion
Anumal > Baboon
Anumal > Zebra
etc etc etc...

Вот мой код зацикливания.Если кто-нибудь может помочь мне сократить количество строк кода, то я был бы признателен:)

public IEnumerable<Category> GetParentChildCategories()
{
     IEnumerable<Category> parentCategoryList = GetParentCategories()
          .Where(x => x.IsActive);
     List<Category> parentChildCategoryList = new List<Category>();

     foreach (Category parentCategory in parentCategoryList)
     {
          foreach (Category childCategory in parentCategory.ChildCategories)
          {
               if (childCategory.IsActive)
               {
                    Category category = new Category
                    {
                         Id = childCategory.Id,
                         Name = parentCategory.Name + " > " + childCategory.Name
                    };
                    parentChildCategoryList.Add(category);
               }
          }
     }

     return parentChildCategoryList;
}

Он взрывается во 2-м элементе foreach, когда хочет пройти по дочерним категориям.Почему это?Вот ошибка:

Уже есть открытый DataReader, связанный с этой командой, который должен быть закрыт первым.

Ответы [ 3 ]

3 голосов
/ 05 октября 2011

EF открывает ридер при итерации parentCategoryList. Затем снова при попытке выполнить итерацию parentCategory.ChildCategories EF откроет Reader. Так как есть открытый ридер, он выдаст ошибку.

Что вам нужно сделать, так это загрузить ChildCategories. Таким образом, EF не нужно снова открывать читатель.

Так что внутри вашего GetParentCategories() метода используйте Include, чтобы быстро загрузить их

return db.Categories.Include(c => c.ChildCategories).Where(/* */);
1 голос
/ 05 октября 2011

добавить

MultipleActiveResultSets=True

в строке подключения

0 голосов
/ 05 октября 2011

Если вы просто хотите, чтобы комбинация была Parent->Child (Category Name), почему бы не вернуть ее через свойство и нет необходимости в этой тяжелой работе

Выполните класс partial для класса Category, а затем напишите следующееproperty

public string MeAndMyParentCategory
{
   get
   {
      //I assuming that your 
      // (Child's relation with the parent category called [Parent])
      if(this.Parent != null)
         return string.Format("{0} > {1}", Parent.Name, this.Name);
      return string.Empty
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...