2011-01-22 1 views
1

J'utilise des objets POCO dans EF 4 sans aucune génération de modèle T4.requête compilée seuls les paramètres scalaires sont autorisés!

J'ai une classe DataContext qui encapsule tous ObjectSets, quelque chose comme ça


public sealed class DataContext :IDisposable 
{ 

public IObjectSet GetObjectSet() where T : MyBase 
{ 

    object objectSet = null; 

    this.objectSets.TryGetValue(typeof(T), out objectSet); 

    if (objectSet == null) 
    { 
    objectSet = this.context.CreateObjectSet(); 
    this.objectSets.Add(typeof(T), objectSet); 
    } 
    return (IObjectSet)objectSet; 
    } 

    public ObjectContext ObjectContext 
    {    
    get 
     { 
     return this.context; 
     } 
    } 
} 

Quand j'ÉCRIRE compilé requête et essayer de passer dans cette classe comme l'un des paramètres, il me donne une erreur d'exécution en disant que les paramètres scalaires sont autorisés

static readonly Func<ObjectContext , DataContext, string, int?> getOperationByOrchestrationName 

    = CompiledQuery.Compile(

    (ObjectContext ctx, DataContext container, string name) => 

    (from or in container.GetObjectSet<MyOrClass>() 

    join op in container.GetObjectSet<MyOpClass>() 

    on or.Id equals op.Id 

    where op.Name == name 
    select op.Id).FirstOrDefault() 

); 

Si je modifie la requête comme cela, il fonctionne, mais je soupçonne profondément sa confection, chaque fois, depuis que je ne suis pas voir l'amélioration des performances, je voudrais voir à partir d'une requête compilée, peut quelqu'un souligne ce qui se passe sur?

static readonly Func, IObjectSet, string, IQueryable> 
    getOperationByOrchestrationName 
    = CompiledQuery.Compile(
     (ObjectContext ctx, IObjectSet ors, IObjectSet ops,string operationName) => 
     from or in ors 
     join op in ops 
     on or.Id equals op.Id 
     where op.Name == name 
     select op.Id 
    ); 

Répondre

0

pour toute personne intéressée, si vous revenez IQueryable de requête compilé et appelez l'une des méthodes qui peuvent changer la requête (SingleOrDefault, ou FirstOrDefault etc), vous ne seriez pas obtenir des avantages d'une requête compilée.

Questions connexes