Для этого у вас может быть таблица, где элемент может ссылаться на своего родителя, если таковой имеется.
Если столбец ParentId
равен NULL
, категорияявляется корневым.Если нет, на родительский элемент ссылаются.
Затем можно найти подкатегории категории, пройдя по таблице и выполнив поиск элементов с ParentId
, равным Id
категории.
Обратите внимание, что ParentId
должен быть проиндексирован для лучшей производительности, и что для обеспечения достоверности ваших данных должен быть внешний ключ от ParentId
до Id
.
Рекурсивное хранение категорий:
private void SaveCategoryRecursively(Category category)
{
foreach (var subCategory in category.SubCategories)
{
query(@"
insert into [dbo].[Categories] ([Id], [ParentId], ...)
values (@id, @parentId, ...)", ...);
this.SaveCategoryRecursively(subCategory);
}
}
public void SaveCategories(IEnumerable<Category> rootCategories)
{
foreach (var category in rootCategories)
{
query(@"
insert into [dbo].[Categories] ([Id], [ParentId], ...)
values (@id, NULL, ...)", ...);
this.SaveCategoryRecursively(category);
}
}