C#之Expression表达式树实例
本文实例讲述了C#之Expression表达式树,分享给大家供大家参考。具体实现方法如下:
表达式树表示树状数据结构的代码,树状结构中的每个节点都是一个表达式,例如一个方法调用或类似x<y的二元运算
1.利用Lambda表达式创建表达式树
Expression<Func<int,int,int,int>>expr=(x,y,z)=>(x+y)/z;
2.编译表达式树,该方法将表达式树表示的代码编译成一个可执行委托
expr.Compile()(1,2,3)
3.IQueryable<T>的扩展方法,WhereIn的实现
vard=list.AsQueryable().WhereIn(o=>o.Id1,newint[]{1,2});
完整代码如下:
usingMongoDB.Bson; usingMongoDB.Driver; usingMongoDB.Driver.Builders; usingSystem; usingSystem.Collections.Generic; usingSystem.Linq; usingSystem.Linq.Expressions; usingSystem.Text; usingSystem.Threading.Tasks;
namespaceMongoDBTest { classProgram { staticvoidMain(string[]args) { //使用LambdaExpression构建表达式树 Expression<Func<int,int,int,int>>expr=(x,y,z)=>(x+y)/z; Console.WriteLine(expr.Compile()(1,2,3));
//使用LambdaExpression构建可执行的代码 Func<int,int,int,int>fun=(x,y,z)=>(x+y)/z; Console.WriteLine(fun(1,2,3));
//动态构建表达式树 ParameterExpressionpe1=Expression.Parameter(typeof(int),"x"); ParameterExpressionpe2=Expression.Parameter(typeof(int),"y"); ParameterExpressionpe3=Expression.Parameter(typeof(int),"z"); varbody=Expression.Divide(Expression.Add(pe1,pe2),pe3); varw=Expression.Lambda<Func<int,int,int,int>>(body,newParameterExpression[]{pe1,pe2,pe3}); Console.WriteLine(w.Compile()(1,2,3));
List<Entity>list=newList<Entity>{newEntity{Id1=1},newEntity{Id1=2},newEntity{Id1=3}};
vard=list.AsQueryable().WhereIn(o=>o.Id1,newint[]{1,2}); d.ToList().ForEach(o=> { Console.WriteLine(o.Id1); }); Console.ReadKey(); } } publicclassEntity { publicObjectIdId; publicintId1; publicstringName{get;set;} }
publicstaticclasscc { publicstaticIQueryable<T>WhereIn<T,TValue>(thisIQueryable<T>query,Expression<Func<T,TValue>>obj,IEnumerable<TValue>values) { returnquery.Where(BuildContainsExpression(obj,values)); } privatestaticExpression<Func<TElement,bool>>BuildContainsExpression<TElement,TValue>(Expression<Func<TElement,TValue>>valueSelector,IEnumerable<TValue>values) { if(null==valueSelector) { thrownewArgumentNullException("valueSelector"); } if(null==values) { thrownewArgumentNullException("values"); } varp=valueSelector.Parameters.Single(); if(!values.Any())returne=>false;
varequals=values.Select(value=>(Expression)Expression.Equal(valueSelector.Body,Expression.Constant(value,typeof(TValue)))); varbody=equals.Aggregate(Expression.Or);
returnExpression.Lambda<Func<TElement,bool>>(body,p); } } }