Expression可以用于组成lambda表达式,我的疑问是我如何用Expression来组成一个三目的表达式?
比如
var a = a.c1 == 1 ? a : null;
这句简单的三目,我如何用Expression来组装lambda?
有高手来支援么?另外还有个问题,我如何用Expression来实现left join?

解决方案 »

  1.   

    var a=arry.Select(x=>x.id<10 ? x: null); //lambda三目表达式类似这样 
      

  2.   


    谢谢,这个我知道但是我问的是用Expression如何来组装。
    我是想在runtime中自动的组装一个lamdba,而非hardcode
      

  3.   

    left join:
     var leftOuterQuery2 =
               from category in categories
               join prod in products on category.ID equals prod.CategoryID into prodGroup
               from item in prodGroup.DefaultIfEmpty()
               select new { Name = item == null ? "Nothing!" : item.Name, CategoryID = category.ID };        Console.WriteLine("LeftOuterJoin2: {0} items in 1 group", leftOuterQuery2.Count());
    具体请参考:http://msdn.microsoft.com/zh-cn/library/vstudio/bb311040(v=vs.110).aspx
      

  4.   

    我问的清楚点吧ParameterExpression p1 = Expression.Parameter(typeof(A), "a1");
    Expression p11 = MemberExpression.Property(p1, "cont");
    var args = new ParameterExpression[] { p1 };
    Expression<Func<A, int>> l1 = Expression.Lambda<Func<A, int>>(p11, args);
    这段代码组成的是 a1 => a1.cont 这个lamdba
    我问的三目类似这个组成过程,如何来做呢?
      

  5.   

    或者ParameterExpression p1 = Expression.Parameter(typeof(A), "a1");
    Expression p11 = MemberExpression.Property(p1, "cont");
    Expression Pconst = ConstantExpression.Constant(1, typeof(Int32));
    Expression op1 = BinaryExpression.Equal(p11, Pconst);
    var args = new ParameterExpression[] { p1 };
    Expression<Func<A, bool>> l = Expression.Lambda<Func<A, bool>>(op1, args);
    组成的是a1 => a1.cont == 1 这个lamdba
      

  6.   

        
    //Expression<Func<A, A>> f = a => a.cont >= 23 ? a : null;
                var par = Expression.Parameter(typeof(A), "a");
                var ex = Expression.Lambda(Expression.Condition(Expression.Equal(MemberExpression.Property(par, "cont"), Expression.Constant(23, typeof(int))), par, Expression.Constant(null, typeof(A))), par);
                var s = (ex.Compile() as Func<A, A>)(new A() { cont = 2 });