$kyD@rk, Структура норм, нолько ChildId в ParentId переименовать.
Ну а дальше 2 варианта:
1) На стороне sql написать рекурсивный CTE запрос, в нем сложить дочерние листы в json поле
2) На стороне C#. Рекурсивно пройти по всей коллекции.
Можно даже один раз выбрать все в коллекцию, а потом на каждой итерации искать в ней дочерние элементы, типа
var children = categories.Where(x.ParentId == item.id).ToList()
Я хочу сгруппировать в контроллере, а потом передать на страницу.
Там где не указан родитель - будет без вложенности, а где указан id - с родителем.
Я без виртуальной таблицы не знаю как это сделать.