Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Écriture d'un CTE récursif à l'aide de la syntaxe Entity Framework Fluent ou de la syntaxe Inline

AFAIK, il n'y a pas de support pour les CTE récursifs dans LINQ ni dans EF. La solution est d'exposer le CTE comme une vue. L'article sur les requêtes récursives ou hiérarchiques utilisant EF Code First et les migrations montre comment déployer une telle vue à l'aide des premières migrations de code EF.

Tenter d'émuler des CTE en effectuant des itérations récursives côté client ne s'adapte pas à de grands ensembles de données et entraîne un échange bavard avec le serveur. Notez comment votre code EF renvoie IEnumerable non IQueryable , cela signifie qu'il matérialise chaque niveau puis concatène le niveau suivant pour chaque entrée en tant que requête séparée . La solution basée sur LINQ fonctionnera raisonnablement pour les hiérarchies peu profondes avec un nombre d'entrées limité (et notez que de nombreux projets peuvent ont une telle mise en page des données, les messages/réponses des utilisateurs étant un exemple typique), mais s'effondreront sous des hiérarchies profondes avec de nombreux éléments.