首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >向IQueryable实例添加LambaExpression

向IQueryable实例添加LambaExpression
EN

Stack Overflow用户
提问于 2010-03-17 16:16:48
回答 2查看 868关注 0票数 3
代码语言:javascript
复制
 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);

现在,假设是_query,我该如何将这个lambada添加到一个IQuerybale实例中

_query.Where(lambada.Compile());?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-03-17 16:31:49

我认为您只需要更改lambda的类型

代码语言:javascript
复制
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>>

类似于:

代码语言:javascript
复制
List< Product > products = new List< Product >
{
    new Product { Name = "bar" }, 
    new Product { Name = "foo" }
};
IQueryable< Product > queryable = products.AsQueryable().Where( lambda );
票数 3
EN

Stack Overflow用户

发布于 2010-03-17 16:20:48

不要使用.Compile,它会将表达式转换为委托。IQueryable是使用表达式过滤的,而不是委托:

代码语言:javascript
复制
_query = _query.Where(lambada);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2460701

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档