Добавление LambaExpression к экземпляру IQueryable - PullRequest
3 голосов
/ 17 марта 2010
 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);
        LambdaExpression lambada = Expression.Lambda<Func<Product, bool>>(expression, parameter);

Теперь, как мне добавить эту лямбаду в экземпляр IQuerybale, скажем, _query

_query.Where (lambada.Compile ());

Ответы [ 2 ]

3 голосов
/ 17 марта 2010

Я думаю, вам просто нужно изменить тип 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 );
0 голосов
/ 17 марта 2010

Не используйте .Compile, это преобразовало бы выражение в делегат. IQueryable фильтруется с использованием выражения, а не делегата:

_query = _query.Where(lambada);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...