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堆栈的原理.