LINQ2SQL: orderby note.hasChildren (), имя по возрастанию - PullRequest
0 голосов
/ 25 мая 2010

У меня есть иерархическая структура данных , которую я отображаю на веб-странице в виде дерева.

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

Я использую рекурсивный метод для построения древовидного представления, в основе которого лежит этот код LINQ:

    var filteredCategory = from c in category
                           orderby c.Name ascending
                           where c.ParentCategoryId == parentCategoryId && c.Active == true
                           select c;

Так что это оператор orderby, который я хочу улучшить.

Ниже показана структура таблицы базы данных:

[dbo].[Category](
    [CategoryId] [int] IDENTITY(1,1) NOT NULL,
    [Name] [varchar](100) NOT NULL,
    [Level] [tinyint] NOT NULL,
    [ParentCategoryId] [int] NOT NULL,
    [Selectable] [bit] NOT NULL CONSTRAINT [DF_Category_Selectable]  DEFAULT ((1)),
    [Active] [bit] NOT NULL CONSTRAINT [DF_Category_Active]  DEFAULT ((1))

Ответы [ 3 ]

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

Если вы используете Linq2SQL, вы не можете построить дерево, просто получив все Категории без родительского элемента, а затем получить доступ к дочерним элементам по мере необходимости для построения дерева?

Я имею в виду что-то вроде этого запроса, чтобы выбрать корень Категории:

Category[] rootCats = (from c in category
    orderby c.Name ascending
    where c.ParentCategoryId == 0 // that is, no parent = root element
        && c.Active == true
    select c).ToArray();

И затем доступ к детям данной категории (IEnumerable<Category>) через oneCat.Category.Where( cat => cat.Active == true).

0 голосов
/ 25 мая 2010
var filteredCategory = category
  .Where(c => c.ParentCategoryId == parentCategoryId
    && c.Active == true)
  .OrderBy(c => c.Children.Any() ? 1 : 2)
  .ThenBy(c => c.Name);

Если у вас нет свойства Children, перейдите к конструктору linq to sql и создайте ассоциацию, которая добавляет свойство.

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

Попробуйте (замените категорию c.Category) на дочерний IQueryable <>:

var filteredCategory = from c in category 
       orderby c.Category.Count == 0
       where c.ParentCategoryId == parentCategoryId && c.Active == true 
       select c; 
...