В этом коде много недостатков.И никакого реального преимущества использования выражений при работе с параметрами IEnumerable
s - Func<..>
, аналогичными стандартным методам LINQ Enumerable
, будет недостаточно.
Но для ответа на ваш конкретный вопрос.Исключением является то, что вы вызываете CreateQuery
с выражением, возвращающим IEnumerable<TSource>
(из-за вызова метода Enumerable.Where
), в то время как оно ожидает (требует) IQueryable
(или IQueryable<TSource>
) выражение типа.
исправить это просто - замените typeof(Enumerable)
на typeof(Queryable)
в вашем Expression.Call
(остальные параметры не изменились), и проблема исчезнет.
Также обратите внимание, что когда у вас есть время компиляции, введите TSource
иIQueryable<TSource>
и Expression<Func<TSource, bool>>
переменных, нет необходимости составлять Where
call и CreateQuery
- вы можете просто использовать метод расширения Queryable.Where
напрямую, например, учитывая
var predicate = Expression.Lambda<Func<TSource, bool>>(predicateBody, sourceObjectParam);
MethodCallExpression whereCallExpression = Expression.Call(
typeof(Queryable),
"Where",
new Type[] { queryableData.ElementType },
queryableData.Expression,
predicate);
IQueryable<TSource> resultsQuery =
queryableData.Provider.CreateQuery<TSource>(whereCallExpression);
можно заменить на
IQueryable<TSource> resultsQuery = queryableData.Where(predicate);
, что позволяет избежать ошибок, подобных этой.