1

J'ai commencé à utiliser linq to sql et le framework d'entité et j'ai trouvé l'expérience de développement assez bonne. Comme la façon dont vous pouvez séparer une requête et combiner différentes requêtes est assez agréable - voir des tuyaux et des filtres.Pipes and Filters et CompiledQuery.Compile

Mais le problème que j'ai trouvé est que les performances peuvent être considérablement augmentées (dans mon cas d'un facteur d'environ 4 que je ne peux pas ignorer) si j'utilise des requêtes conformes. Mais le problème que j'ai trouvé avec les cahiers compilés est qu'ils n'aiment pas travailler avec IQueryable ...

Est-ce que quelqu'un a des idées sur la façon dont je peux contourner cette lacune ??? La façon dont je travaillais était que la requête compilée faisait juste référence à d'autres requêtes qui utilisaient IQueryable, de cette façon je pouvais basculer entre les requêtes compilées ou non. Mais comme je l'ai découvert, cela ne fonctionne pas très bien.

Des idées?

Vive Anthony

Répondre

1

Non, vous ne pouvez pas composer les résultats de CompiledQuery avec un autre IQueryable. Souvenez-vous que CompiledQuery a pour seul but de mettre en cache les résultats de la transformation d'un IQueryable en un arbre de commandes canoniques Entity Framework. Si vous pouviez ensuite composer ceci avec un autre IQueryable, alors il devrait être recompilé pour l'exécution, ce qui annule complètement le but de CompiledQuery.

+0

Cela signifie-t-il que si vous voulez utiliser des requêtes compilées, vous ne réutiliserez pas la logique comme vous le feriez si vous n'utilisiez pas de requêtes compilées et n'utilisiez pas de canaux et de filtres? –

+0

Cela signifie vraiment que CompiledQuery ressemble beaucoup à une instruction SQL préparée. En d'autres termes, vous pouvez modifier les valeurs d'argument (paramètre), mais vous ne pouvez pas composer cette instruction avec d'autres opérateurs SQL. Cela est logique, car l'objectif de la préparation d'instructions SQL est de s'assurer que vous n'effectuez qu'une seule fois l'analyse syntaxique des requêtes et l'allocation des ressources serveur pour une instruction que vous exécuterez plusieurs fois (potentiellement avec des valeurs de paramètre différentes). CompiledQuery est la même chose, uniquement pour les expressions. –

+0

Je sais ce que vous dites mais ne serait pas la chose la plus logique à faire serait d'évaluer l'expression la première fois, en tenant compte des tuyaux et des filtres, puis cache les résultats ... –