2010-08-19 11 views
3

J'ai un Func défini comme suit:Besoin Func pour fournir à where() méthode à la fois IEnumerable et IQueryable

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 Pour fournir le même Func à la méthode Where d'un IQueryable, j'obtiens:

'Impossible de convertir le type de source System.Collections.Generic.IEnumerable en System.Linq.IQueryable.'

Que se passe-t-il? Comment puis-je définir un Func qui fonctionnera comme une spécification pour IEnumerable et IQueryable?

Répondre

3

IQueryable Les méthodes LINQ prennent Expression Trees, et non les délégués normaux.

Par conséquent, vous devez 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()); 
+0

Mais alors je ne peux pas interroger IEnumerables avec !!! Sûrement il doit y avoir un moyen que je peux utiliser la même spécification avec les deux? – David

+0

Oh, et merci pour votre réponse! – David

+0

D'accord, merci, mais quelle honte pour l'API de Linq. – David