2010-09-24 3 views

Répondre

11

n °

Entity Framework doit être en mesure de voir tout ce qui est tentée.

Donc, si vous simplement avez fait quelque chose comme ceci:

queryable.Where(f => DelegateFunc(f)); 

Lorsque la définition de DelegateFunc ressemble à ceci:

public bool DelegateFunc(Foo foo) 
{ 
    return foo.Id > 4; 
} 

Entity Framework n'a aucun moyen de peering à l'intérieur du délégué, à craquer il s'ouvre et le convertit en SQL.

Tout n'est pas perdu cependant.

Si votre objectif est de réutiliser les filtres communs, etc vous pouvez faire quelque chose comme ceci:

public Expression<Func<Foo, bool>> DelegateExpression{ 
    get{ 
     Expression<Func<Foo,bool>> expr = f => f.Id > 4; 
     return expr; 
    } 
} 

queryable.Where(DelegateExpression); 
+0

Vous avez tort, Alex. Je passe à la méthode Where comme suit: "queryable.Where (f => DelegateFunc);" au lieu de "queryable.Where (f => DelegateFunc (f));". L'instruction a été exécutée avec succès mais elle a renvoyé un message Enumerable not Queryable. – Linh

+0

Je ne suis pas d'accord. Généralement, lors de l'exécution d'un filtre, vous voulez le convertir en SQL. L'obtention d'un IEnumerable prouve que vous n'exécutez PAS le filtre dans la base de données, mais LINQ pour les objets qu'il prend en charge, et vous récupérez chaque enregistrement dans la base de données et le filtrage en mémoire. Cela pourrait bien marcher dans les tests, mais une fois que vous aurez beaucoup de données, cela fonctionnera terriblement. Essentiellement, vous n'utilisez EF que pour matérialiser des entités, ce qui est un anti-pattern. –

+0

Votre commentaire est très utile, Alex. Il a montré le défaut de performance à ma manière. Au lieu de passer une méthode déléguée, je passerai une expression >, qui est retournée par une méthode. Dans cette méthode, je peux personnaliser la condition. – Linh

Questions connexes