2009-09-10 11 views
1

meilleur pour décrire ce dans le code ...Puis-je citer une requête compilée en tant que source de données dans une requête compilée?

Je possède ce

public class A<T> 
{ 
    public static class Queries 
    { 
      public static Func<DataContext, int, T>Get = 
       CompiledQuery.Compile<DataContext, int, T>(
        (DataContextdb, int i) => (from t in db.GetTable<T>() 
                 where t.ID == i 
                 select t).SingleOrDefault()); 
    } 
} 

Puis-je créer une nouvelle classe et requête, comme ça ...

public class B<T>:A<t> 
{ 
     public static class BQueries 
     { 
      public static Func<DataContext, int, T> Get = 
       CompiledQuery.Compile<DataContext, int, T>(
        (DataContext db, int id) => (from t in A.Queries.Get(db, id) 
               where !t.Item.Deleted 
               select t).SingleOrDefault()); 
     } 

     public abstract TrackingItem Item; 
} 

Tout ce que je veux do compile une nouvelle requête basée sur l'original qui ajoute quelques contraintes. Ceci au lieu d'exécuter deux requêtes

Répondre

0

Cela fonctionnerait si A.Queries.Get(...) renvoyait un IQueryable<>, mais comme écrit votre code renvoie un T. Cependant, si vous supprimez SingleOrDefault() cela devrait fonctionner correctement.

Mise à jour: Pour faire bonne mesure, ce code devrait fonctionner:

public static class Queries 
{ 
    public static Func<DataContext, int, IQueryable<T>>Get = 
     CompiledQuery.Compile<DataContext, int, IQueryable<T>>(
      (DataContext db, int i) => from t in db.GetTable<T>() 
             where t.ID == i 
             select t); 
} 

public static class BQueries 
{ 
    public static Func<DataContext, int, IQueryable<T>> Get = 
     CompiledQuery.Compile<DataContext, int, IQueryable<T>>(
      (DataContext db, int id) => from t in A.Queries.Get(db, id) 
             where !t.Item.Deleted 
             select t); 
} 

Les requêtes ne seront pas exécutés en fait jusqu'à ce que vous appelez un opérateur immédiat comme SingleOrDefault():

using(var db = new MyDataContext()) 
{ 
    var res = BQueries.Get(db, id); 
    var entity = res.SingleOrDefault(); 
    // ... 
} 
+0

Eh bien, il en fait des retours T –

+0

Ah je vois maintenant ... c'est logique. Je tirais pour une exécution différée. Est-il même logique de compiler SingleOrDefault dans une requête? –

+0

C'est toujours un compromis entre la convivialité et le coût de performance de l'analyse de l'expression. J'ai tendance à différer le plus longtemps possible, mais cela dépend de votre cas d'utilisation. – dahlbyk

Questions connexes