LINQ to SQL - Группировка категорий по parentId - PullRequest
0 голосов
/ 25 мая 2010

Я пытаюсь создать навигационное меню, используя таблицу категорий из моей базы данных.

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

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)

Мне нужно иметь возможность передать это как некий «сгруппированный» (сгруппированный по парентиде) сбор в мой View.

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

Ответы [ 3 ]

0 голосов
/ 25 мая 2010

Казалось бы, это хороший пример того, как перевод вашей модели в 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 голосов
/ 25 мая 2010
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

Затем вы можете просмотреть его и отформатировать соответствующим образом.

0 голосов
/ 25 мая 2010

Как насчет чего-то вроде:

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 ) );
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...