class Program : ExpressionVisitor
{
static void Main(string[] args)
{
var array = new int[] { 1, 2, 3, 4, 5 };
var array1 = new int[] { 1, 2, 4, 5, 6, 7, 8 }; Expression left = null;
ParameterExpression parameter = Expression.Parameter(typeof(int));
Program expressionVisitor = new Program(parameter); foreach (var item in array)
{
Expression<Func<int, bool>> lambda = e => e == item;
var right = expressionVisitor.Visit(lambda.Body);
if (left == null)
left = right; left = Expression.Or(left, right);
}
Expression<Func<int, bool>> where = Expression.Lambda<Func<int, bool>>(left, parameter);
var query = array1.Where(where.Compile());
foreach (var item in query)
{
Console.WriteLine(item);
}
} public Program(ParameterExpression parameter)
{
this.Parameter = parameter;
} public ParameterExpression Parameter { get; private set; } public override Expression Visit(Expression expression)
{
return base.Visit(expression);
} protected override Expression VisitParameter(ParameterExpression node)
{
return Parameter;
}
}以上代码得到的结果是5.
如果把Expression<Func<int, bool>> lambda = e => e == item;这句代码改为
int a = item;
Expression<Func<int, bool>> lambda = e => e == a;
则得到1,2,4,5
求大牛解释关于Expression执迟执行和foreach堆栈的原理.
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货