Я думаю, вам просто нужно изменить тип lambda
ParameterExpression parameter = Expression.Parameter(typeof(Product), "x");
MemberExpression Left = Expression.MakeMemberAccess(parameter, typeof(Product).GetProperty("Name"));
ConstantExpression Right = Expression.Constant(value, typeof(String));
BinaryExpression expression = Expression.Equal(Left, Right);
Expression< Func< Product, bool > > lambda = Expression.Lambda<Func<Product, bool>>(expression, parameter);
Теперь это Expression<Func<Product, bool>>
и IQueryable.Where
принимает это в качестве аргумента. Expression.Lambda<TDelegate>
возвращает TDelegate
, что также LambdaExpression
, поэтому строка Expression.Lambda
компилируется в вашем случае и в моем случае, но IQueryable.Where
хочет видеть ее как Expression<Func<Product, bool>>
.
Что-то вроде:
List< Product > products = new List< Product >
{
new Product { Name = "bar" },
new Product { Name = "foo" }
};
IQueryable< Product > queryable = products.AsQueryable().Where( lambda );