Besoin Func d'alimentation méthode where () des deux IEnumerable et IQueryable
-
29-09-2019 - |
Question
J'ai un Func défini comme suit:
Func<Foo, bool> IsSuperhero = x => x.WearsUnderpantsOutsideTrousers;
Je peux interroger IEnumerables comme ceci:
IEnumerable<Foo> foos = GetAllMyFoos();
var superFoos = foos.Where(IsSuperhero);
Mais lorsque je tente de fournir le même Func au cas où la méthode d'un IQueryable, je reçois:
'Impossible de convertir le type de source System.Collections.Generic.IEnumerable à System.Linq.IQueryable.
Que se passe-t-il? Comment puis-je définir un Func qui fonctionnera comme un cahier des charges pour les IEnumerable et IQueryable?
La solution
méthodes de LINQ de IQueryable
prennent Les arbres d'expression , non délégués normaux.
, vous devez donc changer votre variable func
à un Expression<Func<Foo, bool>>
, comme ceci:
Expression<Func<Foo, bool>> IsSuperhero = x => x.WearsUnderpantsOutsideTrousers;
Pour utiliser la même variable avec un IEnumerable<T>
, vous aurez besoin d'appeler AsQueryable()
ou Compile()
, comme ceci:
IQueryable<Foo> superFoos = foos.AsQueryable().Where(IsSuperhero);
IEnumerable<Foo> superFoos = foos.Where(IsSuperhero.Compile());