• 表达式树使用(四)


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

    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();
              
            }
        }
    

    运行结果如图:

    这里写图片描述

  • 相关阅读:
    开源mvcpager分页控件分页实例
    「YNOI2016」自己的发明
    「SNOI2017」一个简单的询问
    势能分析(splay分析)
    「Ynoi2018」未来日记
    「JOISC 2016 Day 1」棋盘游戏
    「ZJOI2014」璀灿光华
    「ZJOI2019」线段树
    「科技」区间众数
    「ZJOI2017」树状数组
  • 原文地址:https://www.cnblogs.com/Wulex/p/6962313.html
Copyright © 2020-2023  润新知