Projecting self referencing multi level Entities In Entity Framework 6

后端 未结 2 1714
感情败类
感情败类 2021-01-14 02:48

Projecting self referencing multi level entities in Entity Framework 6.

Let\'s say that I have a Category entity as follows:

public clas         


        
2条回答
  •  有刺的猬
    2021-01-14 03:42

    I can't say if it's the best or elegant way, but it's pretty standard and efficient non recursive way of building such structure.

    Start with loading all categories without parent / child object links using a simple projection:

    var allCategories = db.Categories
        .Select(c => new CategoryView
        {
            Id = c.CategoryId,
            ParentCategoryId = c.ParentCategoryId,
            Name = c.Name,
            Description = c.Description,
            ProductCount = c.Products.Count()
        })
        .ToList();
    

    then create a fast lookup data structure for finding CategoryView by Id:

    var categoryById = allCategories.ToDictionary(c => c.Id);
    

    then link the subcategories to their parents using the previously prepared data structures:

    foreach (var category in allCategories.Where(c => c.ParentCategoryId != null))
    {
        category.ParentCategory = categoryById[category.ParentCategoryId.Value];
        category.ParentCategory.SubCategories.Add(category);
    }
    

    At this point, the tree links are ready. Depending of your needs. either return the allCategories or the root categories if you need a real tree representation:

    return allCategories.Where(c => c.ParentCategoryId == null);
    

    P.S. Actually the allCategories list can be avoided, since categoryById.Values could serve the same purpose.

提交回复
热议问题