Linq 表达式和“不包含”查询

ShP*_*ShP 2 .net c# linq lambda

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

我想将其翻译为表达式,如下所示:

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);
Run Code Online (Sandbox Code Playgroud)

这会工作得像Contains,但如何改变它的样子!Contains呢?

如果我尝试用它包装它,Expression.Not则会出现错误:

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

Wil*_*sem 5

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

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

由于 lambda 表达式是一个函数,因此您不能对 lambda 表达式本身取反,只能对lambda 表达式的结果取反