Требуется Func для предоставления метода Where () как IEnumerable, так и IQueryable - PullRequest
3 голосов
/ 19 августа 2010

У меня есть функция, определенная следующим образом:

Func<Foo, bool> IsSuperhero = x => x.WearsUnderpantsOutsideTrousers;

Я могу запросить IEnumerables следующим образом:

IEnumerable<Foo> foos = GetAllMyFoos();
var superFoos = foos.Where(IsSuperhero);

Но когда я пытаюсь предоставить тот же Func для метода Where IQueryable, я получаю:

'Невозможно преобразовать тип источника System.Collections.Generic.IEnumerable в System.Linq.IQueryable.'

Что происходит? Как определить Func, который будет работать как спецификация для IEnumerable и IQueryable?

1 Ответ

3 голосов
/ 19 августа 2010
Методы LINQ

IQueryable принимают Деревья выражений , а не обычные делегаты.

Поэтому вам необходимо изменить переменную func на Expression<Func<Foo, bool>>, например так:

Expression<Func<Foo, bool>> IsSuperhero = x => x.WearsUnderpantsOutsideTrousers;

Чтобы использовать ту же переменную с IEnumerable<T>, вам нужно вызвать AsQueryable() или Compile(), например:

IQueryable<Foo> superFoos = foos.AsQueryable().Where(IsSuperhero);
IEnumerable<Foo> superFoos = foos.Where(IsSuperhero.Compile());
...