Linq表达式浅析概述

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

当年,俺被误导,说是linq怎么实现组合捏?因为linq是预编译滴,没有办法想拼一个sql字符串出来,让我纠结很久,但是,我觉得微软的人应该比较厉害,所以我本着“有困难要上,没有困难制造困难也要上”的原则,在还没有熟悉LINQ TO ADO.NET的情况下,我觉得决定在最近的我自己独立完成小项目里使用ASP.NET MVC + ADO.NET EF。一般的信息系统都有一个组合查询的功能,我很快用jquery做了这样一个功能。

这个表单将组合条件提交后台,我先将它封装成条件对象的数组:

 
 
 
  1. publicclassCondition  
  2. {  
  3. /// 
  4. ///字段  
  5. /// 
  6. publicstringField{get;set;}  
  7. /// 
  8. ///表达式  
  9. /// 
  10. publicstringOperator{get;set;}  
  11. /// 
  12. ///值  
  13. /// 
  14. publicstringValue{get;set;}  
  15. /// 
  16. ///关系  
  17. /// 
  18. publicstringRelation{get;set;}  
  19.  
  20. /// 
  21. ///  
  22. /// 
  23. ///<paramnameparamname="fileds"> 
  24. ///<paramnameparamname="operators"> 
  25. ///<paramnameparamname="values"> 
  26. ///<paramnameparamname="relations"> 
  27. /// 
  28. publicstaticCondition[]BuildConditions(string[]fileds,
    string[]operators,string[]values,string[]relations)  
  29. {  
  30. if(fileds==null||operators==null||values==null||relations==null)  
  31. {  
  32. returnnull;  
  33. }  
  34. Condition[]conditions=newCondition[fileds.Length];  
  35. try  
  36. {  
  37. for(inti=0;i;i++)  
  38. {  
  39. conditions[i]=newCondition()  
  40. {  
  41. Field=fileds[i],  
  42. Operator=operators[i],  
  43. Value=values[i],  
  44. Relation=relations[i]  
  45. };  
  46. }  
  47. }  
  48. catch  
  49. {  
  50. returnnull;  
  51. }  
  52. returnconditions;  
  53. }  

实际上,编译器是把Linq表达式编译成expression tree的形式,我只需要将条件对象数组转换为expression tree就可以了。

我先将一个条件转化为一个简单的expression。

 
 
 
  1. privatestaticExpressionConditonToExpression(Conditioncondition,Expressionparameter)  
  2. {  
  3. Expressionexpr=null;  
  4. Typetype=typeof(EDM_Resource);  
  5.  
  6. PropertyInfopi=type.GetProperty(condition.Field);  
  7. ExpressionExpressionleft=Expression.Property(parameter,pi);  
  8.  
  9. objectvalue=Convert.ChangeType(condition.Value,pi.PropertyType);  
  10. ExpressionExpressionright=Expression.Constant(value);  
  11. switch(condition.Operator)  
  12. {  
  13. case"=":  
  14. expr=Expression.Equal(left,right);  
  15. break;  
  16. case"<":  
  17. expr=Expression.LessThan(left,right);  
  18. break;  
  19. case"<=":  
  20. expr=Expression.LessThanOrEqual(left,right);  
  21. break;  
  22. case">":  
  23. expr=Expression.GreaterThan(left,right);  
  24. break;  
  25. case">=":  
  26. expr=Expression.GreaterThanOrEqual(left,right);  
  27. break;  
  28. }  
  29. returnexpr;  

然后组合,变成一个Linq表达式,追加到where上。

 
 
 
  1. publicIListFindByGroup(EDM_ResGroupresGroup,
    Condition[]conditions,intfirst,intlimit,outintcount)  
  2. {  
  3. using(ShengjingEDM2Entitiescontext=newShengjingEDM2Entities())  
  4. {  
  5. IQueryableresult=DoFindByGroup(resGroup,context);  
  6. ParameterExpressionparameter=Expression.Parameter(typeof(EDM_Resource),"r");  
  7. Expressionbody=null;  
  8.  
  9. if(conditions!=null&&conditions.Length>0)  
  10. {  
  11. body=ConditonToExpression(conditions[0],parameter);  
  12. for(inti=1;i;i++)  
  13. {  
  14. Expressionright=ConditonToExpression(conditions[i],parameter);  
  15. body=conditions[i-1].Relation.ToUpper().Equals("AND")?  
  16. Expression.And(body,right):  
  17. Expression.Or(body,right);  
  18. }  
  19. }  
  20.  
  21. if(body!=null)  
  22. {  
  23. Expression,bool>>expr=Expression.
    Lambda,bool>>(body,parameter);  
  24. resultresult=result.Where(expr);  
  25. }  
  26. resultresult=result.OrderByDescending,int>(r=>r.ResourceID);  
  27. count=result.Count();  
  28. returnresult  
  29. .Skip(first)  
  30. .Take(limit)  
  31. .ToList();  
  32. }  

原来linq这么强大,这么爽,比拼where条件的方法优雅多了,开发效率也是提高不少,而且我发现性能也不错,100万级的数据通过索引和分页查询还算可以。

名称栏目:Linq表达式浅析概述
文章转载:http://www.shufengxianlan.com/qtweb/news41/350891.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联