2010-05-25 3 views
0

Я пытаюсь создать меню навигации, используя таблицу категорий из моего db.LINQ to SQL - группировка категорий по parentId

У меня такая же схема, как показано ниже в таблице категорий.

public List<Category> CategoryData = new List(new Category[] { 
             new Category{ CategoryId = 1, Name = "Fruit", ParentCategoryId = null}, 
             new Category{ CategoryId = 2, Name = "Vegetables", ParentCategoryId = null}, 
             new Category{ CategoryId = 3, Name = "Apples", ParentCategoryId = 1}, 
             new Category{ CategoryId = 4, Name = "Bananas", ParentCategoryId = 1}, 
             new Category{ CategoryId = 5, Name = "Cucumber", ParentCategoryId = 2}, 
             new Category{ CategoryId = 6, Name = "Onions", ParentCategoryId = 2} 
           ); } 

выше должен возвращать что-то вроде

фруктов (родительских)

"===Apples, Bananas (child) 

Овощей (родитель)

"===Cucumber, Onions (child) 

Мне нужно, чтобы быть в состоянии передать это как своего рода коллекции «сгруппированы» (сгруппированы по родительской) в мой вид.

Как это сделать?

ответ

0

Казалось бы, это хороший пример того, при переводе вашей модели к ViewModel пригодится. Поскольку вы можете создать коллекцию CategoryViewModel, у которой есть свойство Childrens CategoryViewModel, используя тот же метод, описывающий @thomas.

public class CategoryViewModel 
{ 
    public int CategoryId { set; get; } 
    public string CategoryName { set; get; } 
    public int? ParentCategoryId { set; get; } 
    public IEnumerable<CategoryViewModel> Children { set; set; } 
} 

public static IEnumerable<CategoryViewModel> GetAllCategoryViewModel(IList<Category> categories) 
{ 
     var query = GetChildren(null, categories); 
     return query.ToList(); 

} 

public static IEnumerable<CategoryViewModel> GetChildren(int? parentId, IList<Category> categories) 
{ 
    var children = from category in categories 
        where category.ParentCategoryId == parentId 
        select 
        new CategoryViewModel 
        { 
         CategoryId = category.CategoryId, 
         CategoryName = category.CategoryName, 
         ParentCategoryId = category.ParentCategoryId, 
         Children = GetChildren(category.CategoryId, categories) 
        }; 

    return children; 
} 
0

Как о чем-то вроде:

private void Test() 
{ 
    var categoryData = new List 
             { 
              new Category {CategoryId = 1, Name = "Fruit", ParentCategoryId = null}, 
              new Category {CategoryId = 2, Name = "Vegetables", ParentCategoryId = null}, 
              new Category {CategoryId = 3, Name = "Apples", ParentCategoryId = 1}, 
              new Category {CategoryId = 4, Name = "Bananas", ParentCategoryId = 1}, 
              new Category {CategoryId = 5, Name = "Cucumber", ParentCategoryId = 2}, 
              new Category {CategoryId = 6, Name = "Onions", ParentCategoryId = 2} 
             }; 
    var query = from category in categoryData 
       where category.ParentCategoryId == null 
       select category; 

    foreach (var item in query) 
    { 
     Debug.WriteLine(string.Format("{0} (parent)", item.Name)); 
     Debug.WriteLine(GetChildren(item.CategoryId, categoryData )); 
    } 

} 
private static string GetChildren(int parentCategoryId, IEnumerable categoryData) 
{ 
    var children = (from category in categoryData 
        where category.ParentCategoryId == parentCategoryId 
        select category.Name).ToArray(); 

    return string.Format("==={0} (child)", string.Join(", ", children)); 
}
0
var list = from a in CategoryData 
     join b in CategoryData on a.ParentCategoryId equals b.CategoryId into c 
     from d in c.DefaultIfEmpty() 
     where d != null 
     select new { 
      a.CategoryId, 
      a.Name, 
      a.ParentCategoryId, 
      ParentName = d.Name 
     }; 

возвращает

CategoryId Name  ParentCategoryId ParentName 
3    Apples  1     Fruit 
4    Bananas  1     Fruit 
5    Cucumber 2     Vegetables 
6    Onions  2     Vegetables 

Вы можете затем цикл через него на ваш взгляд и формат соответственно.

Смежные вопросы