Entity Framework Filter "Expression & lt; Func & lt; T, bool & gt; & gt;"
Je suis en train de créer une méthode de filtrage pour Entity framework Liste et de mieux comprendre la Expression<Func<...
J'ai une Fonction de Test de ce genre.
public IQueryable<T> Filter<T>(IEnumerable<T> src, Expression<Func<T, bool>> pred)
{
return src.AsQueryable().Where(pred);
}
et si je fais ceci:
context.Table.Filter(e => e.ID < 500);
ou ceci:
context.Table.Filter(e => e.SubTable.Where(et => et.ID < 500).Count() > 0 && e.ID < 500);
que tout cela fonctionne bien.
Mais si je fais cela:
context.Table.Filter(e => e.SubTable.Filter(et => et.ID < 500).Count() > 0 && e.ID < 500);
ou ceci:
context.Table.Where(e => e.SubTable.Filter(et => et.ID < 500).Count() > 0 && e.ID < 500);
Je reçois un message d'erreur. LINQ to Entities does not recognize the method ...Filter...
Pourquoi il fonctionne dans un cas et pas dans l'additionneur? Que dois-je changer dans le Filtre pour qu'il fonctionne avec les tables liées.
Je préfère rester à l'écart de bibliothèque externe est aussi ce que je veux, c'est apprendre comment il fonctionne et être capable de l'utiliser dans n'importe quel scénario dans l'avenir.
Dans les deux premiers cas, l'exécution du filtre dans la base de données correctement.
source d'informationauteur Pedro.The.Kid
Vous devez vous connecter pour publier un commentaire.
Jon et Tim déjà expliqué pourquoi il ne fonctionne pas.
En supposant que le code de filtrage à l'intérieur de
Filter
n'est pas anodin, vous pouvez changerFilter
de sorte qu'elle retourne une expression EF pouvez traduire.Supposons que vous avez ce code:
Vous pouvez maintenant créer une méthode que les rendements de cette expression:
D'utilisation serait comme ceci:
L'expression construire à l'intérieur de
FilterByNameLength
peut être arbitrairement complexe, aussi longtemps que vous pouvez passer directement àWhere
.Il est utile de comprendre la différence entre
Expression<Func<>>
etFunc<>
.Un
Expression
e => e.ID < 500
magasins de l'info au sujet de cette expression: qu'il y a unT
e
que vous êtes accédant à la propriétéID
l'appel de la<
opérateur avec laint
valeur500
. EF ressemble à cela, il pourrait se transformer en quelque chose comme[SomeTable].[ID] < 500
.Un
Func
e => e.ID < 500
est une méthode équivalente à:Il est compilé comme IL code qui fait cela, il n'est pas conçu pour être "reconstitué" dans une requête SQL ou quoi que ce soit d'autre, seulement exécuter.
EF prend votre
Expression
il doit comprendre toutes les pièces de l', parce qu'il utilise pour construire une requête SQL. Il est programmé pour savoir ce que lesWhere
méthode. Il ne sait pas ce que votreFilter
méthode, même si c'est une méthode triviale, jusqu'à ce qu'il abandonne.Parce que EF n'est pas vraiment "savoir" à propos de votre
Filter
méthode. Il n'a aucune compréhension de ce qu'il doit faire, il ne sait pas comment le traduire en SQL. Comparez cela avecWhere
etc, il ne comprendre.La version où vous l'appelez directement sur la première table fonctionne parce que de cette façon, vous ne finissent pas avec une arborescence d'expression contenant un appel à
Filter
- il appelle justeFilter
directement, ce qui à son tour ne construire une requête... mais qui EF comprend.Je serais très surpris si vous pouviez un moyen de l'obtention de votre
Filter
méthode de travail au sein d'une requête EF... mais vous avez déjà dit que l'utilisation deWhere
fonctionne de toute façon, alors pourquoi utiliserFilter
à tous? J'aimerais utiliser leWhere
version - ou, mieux encore, utiliser leAny
surcharge qui prend un prédicat: