Compiler Automatiquement Les Requêtes Linq

Nous avons constaté que la compilation de nos requêtes Linq est beaucoup, beaucoup plus rapide que d'avoir à compiler à chaque fois, donc nous aimerions commencer à utiliser les requêtes compilées. Le problème est que cela rend le code plus difficile à lire, car la syntaxe de la requête est éteint dans un autre fichier, de là où il est utilisé.

Il m'est apparu qu'il pourrait être possible d'écrire une méthode (ou une extension de la méthode) qui utilise la réflexion pour déterminer quelles requêtes sont passés dans et cache les versions compilées automatiquement pour une utilisation dans l'avenir.

var foo = (from f in db.Foo where f.ix == bar select f).Cached();

Cached() devra refléter la requête de l'objet passé en et de déterminer la /les table(s) sélectionné et les types de paramètres de la requête. De toute évidence, la réflexion est un peu lent, de sorte qu'il pourrait être préférable d'utiliser des noms de l'objet dans le cache (mais que vous souhaitez toujours avoir à utiliser la réflexion la première fois à la compilation de la requête).

var foo = (from f in db.Foo where f.ix == bar select f).Cached("Foo.ix");

Quelqu'un a une expérience avec cette, ou de savoir si c'est encore possible?

Mise à JOUR: Pour ceux qui ne l'ont pas vu, vous pouvez compiler des requêtes LINQ à SQL avec le code suivant:

public static class MyCompiledQueries
{
    public static Func<DataContext, int, IQueryable<Foo>> getFoo =
        CompiledQuery.Compile(
            (DataContext db, int ixFoo) => (from f in db.Foo
                                            where f.ix == ixFoo
                                            select f)
        );
}

Ce que j'essaie de faire est d'avoir un cache de ces Func<> objets que je peux appeler automatiquement après la compilation de la requête la première fois autour.

  • C'est une source de confusion question, parce que vous semblez être l'amalgame entre LINQ et LINQ to SQL (qui génère en outre, les compile et les caches des plans d'exécution de derrière les scènes à chaque fois qu'une requête est exécutée). Si vous vous posez à propos de SQL Server est compilé les plans d'exécution, il n'y a aucun moyen (que je suis au courant) pour les compiler et de les garder en cache d'autres que de les exécuter.
  • Cela n'a rien à voir avec SQL Server. LINQ to SQL compile les requêtes, ce qui peut prendre un certain temps-à partir de deux LINQ syntaxes (chaînage ou de type SQL) pour SQL chaque fois que ces requêtes sont exécutées. Lire le lien en haut pour en savoir plus.
  • Un problème que j'ai trouvé avec l'aide de requêtes compilées avec L2S dans une application web, c'est que pour la compilation vous avez besoin de la passer à l'instance de la DataContext - pour une application web, cela signifie que vous avez besoin d'une DataContext pour l'ensemble du site - qui, en retour, m'a causé quelques grands multithread problèmes lorsque le site a commencé à avoir une grosse charge. Vraiment, je n'aime vraiment pas la façon dont vous avez à passer le datacontext instance lors de la compilation de la requête...
  • Vous ne passez pas dans un DataContext lors de la compilation de la requête. Voir ma réponse ci-dessous; vous fait passer dans un délégué qui prend un DataContext (et d'autres paramètres) et retourne une IQueryable<T>.
  • Avez-vous jamais les mettre en œuvre ce chemin? Si oui, comment avez-vous gérer les différents niveaux de DataLoadOptions?
InformationsquelleAutor tghw | 2009-08-03