Что ж, если иерархия строго состоит из 2 уровней, вы всегда можете объединить их и позволить LINQ разобраться с SQL-запросом (в конечном итоге это будет одна поездка, хотя нужно посмотреть, насколько быстро она будет выполняться на вашем объеме данных):
var hlist = from h in Hierarchies
select new {h.Parent, h.Child};
var slist = from h in Hierarchies
join h2 in hlist on h.Parent equals h2.Child
select new {h2.Parent, h.Child};
hlist = hlist.Union(slist);
Это дает вам плоский список IEnumerable<{Item, Item}>
, поэтому, если вы хотите сгруппировать их, просто следуйте:
var glist = from pc in hlist.AsEnumerable()
group pc.Child by pc.Parent into g
select new { Parent = g.Key, Children = g };
Я использовал AsEnumerable()
здесь, когда мы достигли возможности поставщика LINQ SQL при попытке сгруппировать Союз. Если вы попробуете это против IQueryable, он запустит базовый Союз для подходящих родителей, а затем совершите круговую поездку для каждого родителя (чего вы и хотите избежать). Независимо от того, нормально ли вам использовать регулярное LINQ для группировки, зависит тот же объем данных, который в любом случае должен был бы пройти по каналу.
РЕДАКТИРОВАТЬ: В качестве альтернативы вы можете создать представление, связывающее родителя со всеми его дочерними элементами, и использовать это представление в качестве основы для связывания элементов. Теоретически это должно позволить вам / L2S сгруппировать его за одну поездку.