我原来有一个LambdaExpressionSystem.Linq.Expressions.Expression<Func<IEnumerable<int>, IEnumerable<int>>> exp1 = a => a.Where( i => i > 0);但是我后来想变成System.Linq.Expressions.Expression<Func<IEnumerable<int>, IEnumerable<int>>> exp2 = a => a.Where(i => i > 0).Where(i=> i< 5);怎么能够给exp1后面加上Where(i => i <5)从而生成exp2阿?谢谢各位大侠了!

解决方案 »

  1.   

    System.Linq.Expressions.Expression<Func<IEnumerable<int>, IEnumerable<int>>> exp1 = a => a.Where( i => i > 0 && i<5);
      

  2.   

    本来的想法是这样的。有System.Linq.Expressions.Expression<Func<IEnumerable<int>, IEnumerable<int>>> exp1 = a => a.Where( i => i > 0);还有System.Linq.Expressions.Expression<Func<IEnumerable<int>, IEnumerable<int>>> exp1_extra = a => a.Where( i => i < 5);数据 data 要通过 exp1 和 exp1_extra处理,exp1和exp1_extra分开处理太麻烦(因为某些原因),所以说把exp1和exp1_extra合并成 exp2,System.Linq.Expressions.Expression<Func<IEnumerable<int>, IEnumerable<int>>> exp2 = a => a.Where(i => i > 0).Where(i=> i< 5);
    但是我不知道怎么才能把exp1和exp1_extra合并成exp2谢谢各位了。
      

  3.   

    你这样写的exp2是没错的,我1楼给的方法也是对的。有哪里不符合你想法么?或许还不理解你意思。
      

  4.   

    exp2应该是C#动态生成的。比如给定不同的exp1_extra = a => a.Where( i => i < 10000);那么exp2应该相应生成不同的exp2不是手工写的这样我的问题是不是清楚些呢?谢谢了!
      

  5.   

    那你吧条件都配置以下。这样不知道是否符合你要求List<Func<int, bool>> conditions = new List<Func<int, bool>>();
    conditions.Add(i => i > 0);
    conditions.Add(i => i < 5);
    Expression<Func<IEnumerable<int>, IEnumerable<int>>> exp2 = a => a.Where(i => (from d in conditions where !d(i) select d).Count() > 0);
      

  6.   

    由于exp2 = a => exp1(a).Where(i=> i< 5);所以可以这样做var p = Expression.Parameter(typeof(IEnumerable<int>), "a");
    var invoker = Expression.Invoke(exp1, p);
    var caller = Expression.Call(invoker, typeof(Enumerable).GetMethod("Where"), p, (Expression<Func<int, bool>>)(i => i < 5));
    var exp2 = Expression.Lambda<Func<IEnumerable<int>, IEnumerable<int>>>(caller, p);
      

  7.   

    自己回一下通过InvocationExpression, 先把exp1做成InvocationExpression, data是参数然后把exp1的InvocationExpression作为exp2的InvocationExpression。生成的大号InvocationExpression可以用  Expression.Lambda(大号InvocationExpression).Compile().DynamicInvoke()生成结果。