01 |
Бывает в некоторых таблицах используется иерархия в виде дерева с бесконечным уровнем вложенности. Проиллюстрируем сказанное на примере модели: |
|
02 |
Структура таблицы Nodes. Дизайнер таблиц MS SQL 2008 R2
|
|
03 |
Таблица Nodes на диаграмме MS SQL 2008 R2
|
|
04 |
Сущность Node в EF-дизайнере VS 2013
|
|
05 |
Модель заполнена данными: |
|
06 |
1 2 3 4 5 6 7 8 9 10 11 12 13 ID ParentID Name
1 NULL Корневая папка 1
2 1 Папка 1-1
3 1 Папка 1-2
4 1 Папка 1-3
5 2 Папка 1-2-1
6 2 Папка 1-2-2
7 2 Папка 1-2-3
8 NULL Корневая папка 2
9 8 Папка 2-1
10 9 Папка 2-1-1
11 8 Папка 2-2
12 9 Папка 2-1-2 |
|
07 | Задача: |
Получить всех потомков, например, Корневой папки 1 при помощи LINQ-запроса
|
|
08 |
Прямого обхода всех потомков в LINQ не существует (за исключением, конечно же, SelectMany для первого уровня вложенности), поэтому для решения поставленной задачи необходимо написать 2 LINQ-расширения: |
|
09 | VB.NET |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 <System.Runtime.CompilerServices.Extension> _
Public Function Flatten(Of T)(source As IEnumerable(Of T), childSelector As Func(Of T, IEnumerable(Of T))) As IEnumerable(Of T) ... Public Function Flatten(Of T)(source As IEnumerable(Of T), childSelector As Func(Of T, IEnumerable(Of T), IEnumerable(Of T))) As IEnumerable(Of T) ... |
|
10 |
Использование: |
|
11 | VB.NET |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 Dim nodes = db.Nodes _
.Where(Function(n) n.ID = 1) _ ' Выбираем родителя
.Flatten(Function(n) n.Children) _ ' Задаем свойство-селектор потомков
.ToList() ' Получаем список всех потомков, включая родителя
Dim nodes = db.Nodes _
.Where(Function(n) n.ID = 1) _
.Flatten(Function(n) n.Children) _
.Select(Function(n) n.ID) _ ' Выбираем только идетификаторы
.ToList() ' Получаем список идентификаторов (List(Of Integer)) всех потомков, включая родителя
' Результат: ... |
|
13 |
Похожие запросы:
|
|