Linq表达式浅析概述
创始人
2024-06-06 15:51:01
0

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

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

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

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

实际上,编译器是把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万级的数据通过索引和分页查询还算可以。

【编辑推荐】

  1. Linq结果集形状概述
  2. Linq存储过程返回详解
  3. Linq调用LoadProducts方法
  4. Linq使用数据表简单描述
  5. Linq对象引用简单介绍

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
Windows恶意软件20年“... 在Windows的早期年代,病毒游走于系统之间,偶尔删除文件(但被删除的文件几乎都是可恢复的),并弹...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
着眼MAC地址,解救无法享受D... 在安装了DHCP服务器的局域网环境中,每一台工作站在上网之前,都要先从DHCP服务器那里享受到地址动...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...