表达式树使用(四)

如果不真正放下过去,就不会有明天。


Program.cs

 class Program
    {
        static void Main(string[] args)
        {
            string[] companies = {"综合即时通","高山滑雪之家","绍斯里奇","城市电力和照明",
             "Coho酒庄","世界各地的入侵者","平面设计学院","冒险工程",
             "Humongous保险","Woodgrove银行","Margie的旅行","Northwind贸易商",
             "Blue Yonder航空公司","Trey研究","电话公司", "翼尖玩具","卢塞恩出版","第四届咖啡"};

            //要查询的IQueryable数据
            IQueryable<String> queryableData = companies.AsQueryable<string>();

            //表达式树参数
            ParameterExpression pe = Expression.Parameter(typeof(string), "company");

            //-------------------------------------------------------------------------------------------------------
            //Where(company => (company.ToLower() == "coho酒庄" || company.Length > 8))

            //创建一个 MethodCallExpression,它表示对不带参数的实例方法的调用。
            //创建表示表达式“company.ToLower()=="coho酒庄“"的表达式树。
            Expression left = Expression.Call(pe, typeof(string).GetMethod("ToLower", System.Type.EmptyTypes));
            Expression right = Expression.Constant("coho酒庄");
            Expression e1 = Expression.Equal(left, right);

            //创建表示表达式“company.Length> 8"的表达式树
            left = Expression.Property(pe, typeof(string).GetProperty("Length"));
            right = Expression.Constant(8, typeof(int));
            Expression e2 = Expression.GreaterThan(left, right);

            //创建一个 BinaryExpression,它表示仅在第一个操作数的计算结果为 false 时才计算第二个操作数的条件
            //组合表达式树以创建表示表达式“(company.ToLower()=="coho酒庄“|| company.Length> 8)"的表达式树。
            Expression predicateBody = Expression.OrElse(e1, e2);

            //创建表示表达式“queryableData.Where(company =>(company.ToLower()=="coho酒庄“|| company.Length> 8)"的表达式树。
            MethodCallExpression whereCallExpression = Expression.Call(
                typeof(Queryable),
                "Where",
                new Type[] { queryableData.ElementType },
                queryableData.Expression,
                Expression.Lambda<Func<string, bool>>(predicateBody, new ParameterExpression[] { pe }));
   

            //-------------------------------------------------------------------------------------------------------
            //创建表示表达式的表达式树'whereCallExpression.OrderBy(company => company)'
            MethodCallExpression orderByCallExpression = Expression.Call(
                typeof(Queryable),
                "OrderBy",
                new Type[] { queryableData.ElementType, queryableData.ElementType },
                whereCallExpression,
                Expression.Lambda<Func<string, string>>(pe, new ParameterExpression[] { pe }));



            //-------------------------------------------------------------------------------------------------------


            //从表达式树创建可执行查询。
            IQueryable<string> results = queryableData.Provider.CreateQuery<string>(orderByCallExpression);

            //枚举结果
            foreach (string company in results)
            {
                Console.WriteLine(company);
            }

            Console.ReadLine();
          
        }
    }

运行结果如图:

这里写图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值