问题描述
代码如下,问题是如何动态返回:Expression<Func<Web_Base_News_Info,bool>>expression?有其它更好的办法也可以,谢谢。publicvoidTest(ContextExtctx,Params.FieldExtRepeaterfieldExt){//1.封装容器varft=newFieldTest<Web_Base_News_Info>();//封装key对应的变量ft._dictKey.Add(EnumsKV.FieldKeyValues.PkId,p=>p.PkId);ft._dictKey.Add(EnumsKV.FieldKeyValues.FlagStatus,p=>p.flagStatus??0);ft._dictKey.Add(EnumsKV.FieldKeyValues.FlagView,p=>p.flagView??0);ft._dictKey.Add(EnumsKV.FieldKeyValues.FlagPass,p=>p.flagPass??0);//2.封装method对应的变量ft._dictMethod.Add(EnumsKV.FieldMethodValues.Equal,(p,q)=>p==q);ft._dictMethod.Add(EnumsKV.FieldMethodValues.Great,(p,q)=>p>q);ft._dictMethod.Add(EnumsKV.FieldMethodValues.Less,(p,q)=>p<q);ft._dictMethod.Add(EnumsKV.FieldMethodValues.NotEqual,(p,q)=>p!=q);ft._dictMethod.Add(EnumsKV.FieldMethodValues.NotGreat,(p,q)=>p<=q);ft._dictMethod.Add(EnumsKV.FieldMethodValues.NotLess,(p,q)=>p>=q);//3.动态生成查询条件Expression<Func<Web_Base_News_Info,bool>>whereOr=PredicateBuilder.False<Web_Base_News_Info>();var查询条件=whereOr;查询条件=查询条件.Or(w=>w.flagStatus==3);//示例:固定查询条件,下面的动态生成条件类似于这个foreach(varifvsinfieldExt.FieldWhereOr)//要求:动态查询条件{varifv=ifvsasIntItem;Expression<Func<Web_Base_News_Info,bool>>expression=ft.这里如何返回正确的Expression呢(ifv.Key,ifv.Method,ifv.Value);查询条件=查询条件.Or(expression);}var结果二=ctx.Web_Base_News_Info.AsQueryable().Where(查询条件);Response.Write("::B.有"+结果二.Count()+"个【得0个,实际是5个】::<br/>rn");}publicclassFieldTest<T>{publicDictionary<EnumsKV.FieldKeyValues,Func<T,int>>_dictKey=newDictionary<EnumsKV.FieldKeyValues,Func<T,int>>();publicDictionary<EnumsKV.FieldMethodValues,Func<int,int,bool>>_dictMethod=newDictionary<EnumsKV.FieldMethodValues,Func<int,int,bool>>();publicExpression<Func<T,bool>>这里如何返回正确的Expression呢(EnumsKV.FieldKeyValueskey,EnumsKV.FieldMethodValuesmethod,intvalue){Func<T,int>func1=_dictKey[key];Func<int,int,bool>func2=_dictMethod[method];Expression<Func<T,bool>>exp=p=>func2(func1(p),value);returnexp;}}publicenumFieldKeyValues//枚举字段名称{PkId=1,flagStatus=2,flagView=4,flagPass=8,}publicenumFieldMethodValues{///<summary>///Int32、Float、DataTime///</summary>[Description("大于")]Great,[Description("不大于")]NotGreat,[Description("小于")]Less,[Description("不小于")]NotLess,[Description("等于")]Equal,[Description("不等于")]NotEqual,}
解决方案
解决方案二:
EF有个库叫DynamicLINQ你看看如果它能够满足你的条件,你就不用自己开发了。
解决方案三:
解决方案四:
不行啊,我要的是,通过委托,动态的生成,而且是在未知条件的情况下,楼上两位朋友列的都是已知条件的例子。
解决方案五:
publicclassTT{publicintid{get;set;}}publicstaticvoidMain(){//动态构建下面这个表达式树Expression<Func<TT,bool>>ddd=x=>x.id==0;varentitytype=Expression.Parameter(typeof(TT),"x");varproperty=typeof(TT).GetProperty("id");varkey=Expression.MakeMemberAccess(entitytype,property);varvalue=Expression.Constant(0);varterm=BinaryExpression.Equal(key,value);varlambda=Expression.Lambda(term,entitytype);varfunc=lambda.Compile();TTtestobject=newTT(){id=0};objectresult1=func.DynamicInvoke(testobject);objectresult2=ddd.Compile().DynamicInvoke(testobject);Console.WriteLine(result1);Console.WriteLine(result2);}
这样就可以动态构建Expression<Func<T,bool>>了。。我看了下1楼发的DynamicLINQ。我也是看了才知道有这东西。我觉得这东西挺好,可以满足你
解决方案六:
什么未知情况,写个泛型方法应该可以解决
解决方案七:
dlinq允许你拼接字符串得到linq查询或者你可以自己解析,然后构造表达式树来做。
解决方案八:
你要返回Expression<Func<T,bool>>,那么前提,你的未知条件也必然要有一种表达方式。由于你要返回的就是lambda表达式,所以你传入的东西,要么是类似于拼接的string,要么就是一种自己定义的条件表达式类型。不论是哪种,都建议你直接拼接成ESQL直接给Linq2EF执行更为方便。如果执意要Expression<Func<T,bool>>的话,找微软直接提供代码的动态构建lambda表达式的类库System.Linq.Dynamic.DynamicQueryable可以基本满足你的要求,只需要些许处理。它返回的是LambdaExpression,是Expression<>的基类,你可以构建一个永真Expression<>再调用Update方法将动态构建的lambda表达式的逻辑加入,最后就可以得到你要的Expression<Func<T,bool>>了