如何首先在实体框架4.1代码中循环遍历对象的子列表

本文关键字:遍历 循环 对象 列表 代码 何首先 实体 框架 | 更新日期: 2023-09-27 18:10:39

我使用的是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;
}

当想要循环遍历子类别时,它会在第二个foreach中爆炸。为什么会这样?下面是错误:

已经有一个与此命令相关联的打开的数据读取器,必须先关闭。

如何首先在实体框架4.1代码中循环遍历对象的子列表

EF在迭代parentCategoryList时打开阅读器。然后,当您尝试迭代parentCategory.ChildCategories时,EF将打开阅读器。因为有一个打开的阅读器,它将抛出一个错误。

你应该做的是急切加载ChildCategories。这样EF就不用再打开阅读器了。

GetParentCategories()方法中,使用Include来加载它们

return db.Categories.Include(c => c.ChildCategories).Where(/* */);

add

MultipleActiveResultSets=True
连接字符串
中的

如果您只是希望组合为Parent->Child (Category Name),为什么不通过属性返回它,而不需要进行繁重的工作

Category类做一个partial类,然后编写以下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
   }
}