LINQ не предназначен для обработки рекурсивного выбора.
Конечно, можно написать собственный метод расширения, чтобы компенсировать это в LINQ to Objects, но я обнаружил, что LINQ to Entities не нравится функциональность, которую нелегко перевести на SQL.
Edit:
Как ни странно, LINQ to Entities не жалуется на рекурсию Мэтта Уоррена, использующую LINQ здесь . Вы могли бы сделать:
var result = db.Table.Where(item => item.GroupId == 5)
.Traverse(item => db.Table.Where(parent
=> item.ParentId == parent.GroupId));
с использованием метода расширения, определенного здесь:
static class LinqExtensions
{
public static IEnumerable<T> Traverse<T>(this IEnumerable<T> source,
Func<T,IEnumerable<T>> selector){
foreach(T item in source){
yield return item;
IEnumerable<T> children = selector(item);
foreach (T child in children.Traverse(selector))
{
yield return child;
}
}
}
Впрочем, производительность может быть плохой.