如果不真正放下过去,就不会有明天。
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();
}
}
运行结果如图:
