这篇文章将为大家详细讲解有关linq怎么实现组合,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。
之前被误导,说是linq怎么实现组合捏?因为linq是预编译滴,没有办法想拼一个sql字符串出来,让我纠结很久,但是,我觉得微软的人应该比较厉害,所以我本着“有困难要上,没有困难制造困难也要上”的原则,在还没有熟悉LINQ TO ADO.NET的情况下,我觉得决定在最近的我自己独立完成小项目里使用ASP.NET MVC + ADO.NET EF。一般的信息系统都有一个组合查询的功能,我很快用jquery做了这样一个功能。
这个表单将组合条件提交后台,我先将它封装成条件对象的数组:
publicclassCondition { ///<summary> ///字段 ///</summary> publicstringField{get;set;} ///<summary> ///表达式 ///</summary> publicstringOperator{get;set;} ///<summary> ///值 ///</summary> publicstringValue{get;set;} ///<summary> ///关系 ///</summary> publicstringRelation{get;set;} ///<summary> /// ///</summary> ///<paramnameparamname="fileds"></param> ///<paramnameparamname="operators"></param> ///<paramnameparamname="values"></param> ///<paramnameparamname="relations"></param> ///<returns></returns> publicstaticCondition[]BuildConditions(string[]fileds,string[]operators,string[]values,string[]relations) { if(fileds==null||operators==null||values==null||relations==null) { returnnull; } Condition[]conditions=newCondition[fileds.Length]; try { for(inti=0;i<conditions.Length;i++) { conditions[i]=newCondition() { Field=fileds[i], Operator=operators[i], Value=values[i], Relation=relations[i] }; } } catch { returnnull; } returnconditions; } }
实际上,编译器是把Linq表达式编译成expression tree的形式,我只需要将条件对象数组转换为expression tree就可以了。
我先将一个条件转化为一个简单的expression。
privatestaticExpressionConditonToExpression(Conditioncondition,Expressionparameter) { Expressionexpr=null; Typetype=typeof(EDM_Resource); PropertyInfopi=type.GetProperty(condition.Field); ExpressionExpressionleft=Expression.Property(parameter,pi); objectvalue=Convert.ChangeType(condition.Value,pi.PropertyType); ExpressionExpressionright=Expression.Constant(value); switch(condition.Operator) { case"=": expr=Expression.Equal(left,right); break; case"<": expr=Expression.LessThan(left,right); break; case"<=": expr=Expression.LessThanOrEqual(left,right); break; case">": expr=Expression.GreaterThan(left,right); break; case">=": expr=Expression.GreaterThanOrEqual(left,right); break; } returnexpr; }
然后组合,变成一个Linq表达式,追加到where上。
publicIList<EDM_Resource>FindByGroup(EDM_ResGroupresGroup,Condition[]conditions,intfirst,intlimit,outintcount) { using(ShengjingEDM2Entitiescontext=newShengjingEDM2Entities()) { IQueryable<EDM_Resource>result=DoFindByGroup(resGroup,context); ParameterExpressionparameter=Expression.Parameter(typeof(EDM_Resource),"r"); Expressionbody=null; if(conditions!=null&&conditions.Length>0) { body=ConditonToExpression(conditions[0],parameter); for(inti=1;i<conditions.Length;i++) { Expressionright=ConditonToExpression(conditions[i],parameter); body=conditions[i-1].Relation.ToUpper().Equals("AND")? Expression.And(body,right): Expression.Or(body,right); } } if(body!=null) { Expression<Func<EDM_Resource,bool>>expr=Expression.Lambda<Func<EDM_Resource,bool>>(body,parameter); resultresult=result.Where<EDM_Resource>(expr); } resultresult=result.OrderByDescending<EDM_Resource,int>(r=>r.ResourceID); count=result.Count<EDM_Resource>(); returnresult .Skip<EDM_Resource>(first) .Take<EDM_Resource>(limit) .ToList<EDM_Resource>(); } }
关于“linq怎么实现组合”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。