Таким образом, приведенный выше код представляет собой переход родительской и дочерней иерархии в восходящем (родительском) направлении. Таким образом, в худшем случае это приведет к выполнению n запросов к базе данных для глубины иерархии n. Я бы посоветовал вам попробовать отсроченное выполнение, слегка изменив метод, например
public IEnumerable<Node> GetAllParents(IEnumerable<Node> records)
{
if (this.ParentID == 0)
{
// Reach the parent, so create the instance of the collection and brake recursive.
return new List<Node>();
}
var parent = records.Where(p => p.ID == ParentID);
var parents = parent.Concat(parent.GetAllParents(records));
return parent;
}
Я не уверен на 100%, сработает ли это, но идея состоит в том, чтобы использовать деревья выражений / отложенное выполнение, чтобы несколько запросов выполнялись за одну поездку базы данных.
Еще одной идеей было бы написать сохраненный процесс / представление, которое будет возвращать всех родителей (то же самое можно найти в CTE на сервере sql).
EDIT : используется Where
вместо First
для поиска родительского элемента в вышеприведенном коде, поскольку First, безусловно, будет оцениваться немедленно - (предупреждение: код еще не проверен)