将表达式树从等于转换为包含

时间:2018-06-23 20:09:58

标签: c# linq

在我的服务器上,我目前有一个检查对象的字段是否等于给定字符串的方法,它看起来像这样:

var parameter = Expression.Parameter(typeof(Book), "b");
var predicate = Expression.Lambda<Func<Book, bool>>(Expression.Equal(Expression.PropertyOrField(parameter, filterAfter), Expression.Constant(filterField)),parameter);

例如,如果filterAfter是“ title”,而filterField是“ Castle”,则表达式将执行book.title ==“ Castle”。我想做的就是转换上面的表达式,以检查book.title是否在标题中包含子字符串“ Castle”。我该如何实现?

1 个答案:

答案 0 :(得分:1)

使用Expression.Call

var containsMethod = typeof(string).GetMethod(nameof(string.Contains), new[] {typeof(string)});
var predicate = Expression.Lambda<Func<Book, bool>>(
    Expression.Call(
        Expression.PropertyOrField(parameter, filterAfter)
    ,   containsMethod
    ,   new Expression[] { Expression.Constant(filterField) }
    )
,   parameter
);