Linq表达式和"不包含"询问

时间:2017-09-27 19:41:57

标签: c# .net linq lambda

如果我有linq看起来像这样: !new List<int>{1,2,3}.Contains(x.someColumn)

我想把它翻译成Expression,所以像这样:

var mInfo = typeof (List<int>).GetMethod("Contains", new Type[] {typeof (int)});
var lst = new List<int>();

foreach (var a in f.Value.Split(','))
{
    var b = int.Parse(a);
    lst.Add(b);
}

var lConst = Expression.Constant(iList);

var b = Expression.Call(lConst,mInfo, propertyReference);

return Expression.Lambda<Func<TmpResult, bool>>(b, param);

这会像Contains一样工作,但如何将其更改为!Contains

如果我尝试用Expression.Not包裹它,我收到错误:

The unary operator Not is not defined for the type System.Func

1 个答案:

答案 0 :(得分:3)

您可以在lambda表达式的主体上使用Expression.Not方法

return Expression.Lambda<Func<TmpResult, bool>>(Expression.Not(b), param);
//                                              ^ negate body

由于lambda-expression是一个函数,你不能否定lambda表达式,你只能否定lambda表达式的结果