如果我有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
答案 0 :(得分:3)
您可以在lambda表达式的主体上使用Expression.Not
方法:
return Expression.Lambda<Func<TmpResult, bool>>(Expression.Not(b), param);
// ^ negate body
由于lambda-expression是一个函数,你不能否定lambda表达式,你只能否定lambda表达式的结果。