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?

Était-ce utile?

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());
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top