本文向大家介绍Linq表达式,可能好多人还不了解Linq表达式,没有关系,看完本文你肯定有不少收获,希望本文能教会你更多东西。

当年,俺被误导,说是linq怎么实现组合捏?因为linq是预编译滴,没有办法想拼一个sql字符串出来,让我纠结很久,但是,我觉得微软的人应该比较厉害,所以我本着“有困难要上,没有困难制造困难也要上”的原则,在还没有熟悉LINQ TO ADO.NET的情况下,我觉得决定在最近的我自己独立完成小项目里使用ASP.NET MVC + ADO.NET EF。一般的信息系统都有一个组合查询的功能,我很快用jquery做了这样一个功能。
这个表单将组合条件提交后台,我先将它封装成条件对象的数组:
- publicclassCondition
 - {
 - ///
 - ///字段
 - ///
 - publicstringField{get;set;}
 - ///
 - ///表达式
 - ///
 - publicstringOperator{get;set;}
 - ///
 - ///值
 - ///
 - publicstringValue{get;set;}
 - ///
 - ///关系
 - ///
 - publicstringRelation{get;set;}
 - ///
 - ///
 - ///
 - ///<paramnameparamname="fileds">
 - ///<paramnameparamname="operators">
 - ///<paramnameparamname="values">
 - ///<paramnameparamname="relations">
 - ///
 - 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
 ;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
 FindByGroup(EDM_ResGroupresGroup, 
Condition[]conditions,intfirst,intlimit,outintcount)- {
 - using(ShengjingEDM2Entitiescontext=newShengjingEDM2Entities())
 - {
 - IQueryable
 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
 ;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
 ,bool>>expr=Expression. 
Lambda,bool>>(body,parameter); - resultresult=result.Where
 (expr); - }
 - resultresult=result.OrderByDescending
 ,int>(r=>r.ResourceID); - count=result.Count
 (); - returnresult
 - .Skip
 (first) - .Take
 (limit) - .ToList
 (); - }
 - }
 
原来linq这么强大,这么爽,比拼where条件的方法优雅多了,开发效率也是提高不少,而且我发现性能也不错,100万级的数据通过索引和分页查询还算可以。