Как заказать элементы во вложенной коллекции, предоставленной LINQ - PullRequest
4 голосов
/ 21 мая 2010

У меня есть таблица базы данных (SQL Server) под названием Category. И еще одна таблица базы данных с именем SubCategory.

Подкатегория имеет отношение внешнего ключа к категории. Поэтому благодаря LINQ каждый Cateogory имеет свойство SubCategories, и LINQ достаточно хорош, чтобы возвращать все подкатегории, связанные с моей категорией, когда я ее получаю.

Если я хочу отсортировать Категории в алфавитном порядке, я могу просто сделать:

return db.Categories.OrderBy(c => c.Name);

Однако я не знаю, как заказать коллекцию Подкатегории внутри каждой категории.

Моя цель - вернуть коллекцию категорий, где все коллекции подкатегорий внутри них упорядочены в алфавитном порядке по имени.

Ответы [ 4 ]

2 голосов
/ 21 мая 2010

В подобных случаях я предпочитаю использовать методы расширения - поскольку они отлично справляются с инкапсуляцией этой логики для повторного использования - и хорошее имя также может помочь легко обнаружить логику.

Например, в проектах, где я использовал L2S в приложениях MVC, я просто создаю папку в моей папке Models под названием Extensions - затем я добавляю туда методы 'extension' для каждой модели / класса L2S / etc (просто чтобы сохранить вещи организованы).

Тогда для этого случая я бы создал что-то вроде этого:

public static class CategoryExtensions
{

  public static List<SubCategory> GetAlphabetizedSubCategories(this Category category)
  {
    return category.SubCategories
        .OrderBy(sc => sc.Name)
        .ToList();
  }
}

А затем, например, из моего представления MVC, если я передам категорию в качестве модели, я мог бы просто сделать что-то простое, например:

<% foreach(SubCategory subCat in Model.GetAlphabetizedSubCategories()) { %>
  <p>Stuff goes here... </p>
<% } %>

Это пример MVC, но вы можете применять его практически везде, поскольку идея состоит в том, что вы «украшаете» свой объект методом, который явно делает то, что вам нужно, и вы не делаете дополнительных копий. /так далее.

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

Вот один из многих возможных способов сделать это:

В конструкторе dbml выберите связь (пунктирная линия) между Category и Subcategory.

Откройте панель свойств и разверните «Дочернее свойство».

Измените имя с SubCategories на _subCategories и доступ с Public на Internal.

Нажмите на поверхность конструктора и нажмите F7 или щелкните правой кнопкой мыши и выберите «Просмотреть код».

Добавить обьект:

public partial class Category
{
    public IOrderedEnumerable<SubCategory> SubCategories
    {
        get { return _subCategories.OrderBy(s => s.Name); }
    }
}

Теперь у вас есть то же свойство, SubCategories, которое действительно упорядочено.

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

Вы можете сделать это, преобразовав объекты linq в списки.

, например

var categoryList = db.Categories
    .OrderBy(c=> c.Name)
    .ToList();
categoryList.ForEach(c => c.SubCategory.ToList().Sort((x, y) => x.Name.CompareTo(y.Name)));
return categoryList;

Преобразование категорий в список позволяет использовать метод расширения Linq ForEach. Преобразование свойства SubCategory в список дает вам встроенный метод сортировки.

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

Вам необходимо использовать Группировать по для категорий, а затем упорядочивать по подкатегориям.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...