AFAIK non esiste supporto per CTE ricorsivi in LINQ né in EF. La soluzione è esporre il CTE come vista. L'articolo sulle query ricorsive o gerarchiche utilizzando EF Code First e le migrazioni mostra come distribuire tale visualizzazione utilizzando EF code first migrations.
Il tentativo di emulare CTE eseguendo iterazioni lato client ricorsive non si adatta a set di dati di grandi dimensioni e si traduce in uno scambio loquace con il server. Nota come il tuo codice EF restituisce IEnumerable
non IQueryable
, significa che materializza ogni livello e quindi concatena il livello successivo per ogni voce come richiesta separata . La soluzione basata su LINQ funzionerà ragionevolmente per gerarchie poco profonde con un numero di voci limitato (e si noti che molti progetti possono hanno un tale layout dei dati, i post/le risposte degli utenti sono un tipico esempio), ma si sgretoleranno sotto gerarchie profonde con molti elementi.