用于查询列表的动态表达式

时间:2016-04-18 23:20:14

标签: c# dynamic

我有一个方法可以传递属于类型T的字段,然后是ContainsEqualsStartsWith

之类的运算符

到目前为止我有这个代码:

IQueryable<Review> queryable = this.rvCurReviewSet.AsQueryable<Review>();

var paramExp = Expression.Parameter(typeof(Review), "review");
var propExp = Expression.Property(paramExp, "ProductID");
MethodInfo method = typeof(string).GetMethod("Contains", new[] { typeof(string) });
var val = Expression.Constant(input, typeof(string));
var containsExp = Expression.Call(propExp, method, val);

Console.WriteLine(queryable.Provider.CreateQuery<Review>(containsExp).Count());

当我运行它时,我收到错误:附加信息:参数表达式无效

基本上,我想查看Review中的字段是否满足条件。因此,例如,我会找到Review.ProductID contains "123"Review.ProductID startsWith "123"等等。

1 个答案:

答案 0 :(得分:2)

你几乎就在那里 - 但你需要传递一个lambda表达式..

var lam = Expression.Lambda<Func<Review, bool>>(containsExp, paramExp);
Console.WriteLine(queryable.Provider.CreateQuery<Review>(lam).Count());

你所拥有的是一个正文表达式,它在review上运行,但没有指定 review的值来自