Linq表達(dá)式淺析概述
本文向大家介紹Linq表達(dá)式,可能好多人還不了解Linq表達(dá)式,沒有關(guān)系,看完本文你肯定有不少收獲,希望本文能教會(huì)你更多東西。
當(dāng)年,俺被誤導(dǎo),說是linq怎么實(shí)現(xiàn)組合捏?因?yàn)閘inq是預(yù)編譯滴,沒有辦法想拼一個(gè)sql字符串出來,讓我糾結(jié)很久,但是,我覺得微軟的人應(yīng)該比較厲害,所以我本著“有困難要上,沒有困難制造困難也要上”的原則,在還沒有熟悉LINQ TO ADO.NET的情況下,我覺得決定在最近的我自己獨(dú)立完成小項(xiàng)目里使用ASP.NET MVC + ADO.NET EF。一般的信息系統(tǒng)都有一個(gè)組合查詢的功能,我很快用jquery做了這樣一個(gè)功能。
這個(gè)表單將組合條件提交后臺(tái),我先將它封裝成條件對象的數(shù)組:
- publicclassCondition
 - {
 - ///<summary>
 - ///字段
 - ///</summary>
 - publicstringField{get;set;}
 - ///<summary>
 - ///表達(dá)式
 - ///</summary>
 - publicstringOperator{get;set;}
 - ///<summary>
 - ///值
 - ///</summary>
 - publicstringValue{get;set;}
 - ///<summary>
 - ///關(guān)系
 - ///</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;
 - }
 - }
 
實(shí)際上,編譯器是把Linq表達(dá)式編譯成expression tree的形式,我只需要將條件對象數(shù)組轉(zhuǎn)換為expression tree就可以了。
我先將一個(gè)條件轉(zhuǎn)化為一個(gè)簡單的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;
 - }
 
然后組合,變成一個(gè)Linq表達(dá)式,追加到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這么強(qiáng)大,這么爽,比拼where條件的方法優(yōu)雅多了,開發(fā)效率也是提高不少,而且我發(fā)現(xiàn)性能也不錯(cuò),100萬級(jí)的數(shù)據(jù)通過索引和分頁查詢還算可以。
【編輯推薦】















 
 
 
 
 
 
 