自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Linq表達(dá)式淺析概述

開發(fā) 后端
這里介紹編譯器是把Linq表達(dá)式編譯成expression tree的形式,我只需要將條件對(duì)象數(shù)組轉(zhuǎn)換為expression tree就可以了。

本文向大家介紹Linq表達(dá)式,可能好多人還不了解Linq表達(dá)式,沒有關(guān)系,看完本文你肯定有不少收獲,希望本文能教會(huì)你更多東西。

當(dāng)年,俺被誤導(dǎo),說(shuō)是linq怎么實(shí)現(xiàn)組合捏?因?yàn)閘inq是預(yù)編譯滴,沒有辦法想拼一個(gè)sql字符串出來(lái),讓我糾結(jié)很久,但是,我覺得微軟的人應(yīng)該比較厲害,所以我本著“有困難要上,沒有困難制造困難也要上”的原則,在還沒有熟悉LINQ TO ADO.NET的情況下,我覺得決定在最近的我自己獨(dú)立完成小項(xiàng)目里使用ASP.NET MVC + ADO.NET EF。一般的信息系統(tǒng)都有一個(gè)組合查詢的功能,我很快用jquery做了這樣一個(gè)功能。

這個(gè)表單將組合條件提交后臺(tái),我先將它封裝成條件對(duì)象的數(shù)組:

  1. publicclassCondition  
  2. {  
  3. ///<summary> 
  4. ///字段  
  5. ///</summary> 
  6. publicstringField{get;set;}  
  7. ///<summary> 
  8. ///表達(dá)式  
  9. ///</summary> 
  10. publicstringOperator{get;set;}  
  11. ///<summary> 
  12. ///值  
  13. ///</summary> 
  14. publicstringValue{get;set;}  
  15. ///<summary> 
  16. ///關(guān)系  
  17. ///</summary> 
  18. publicstringRelation{get;set;}  
  19.  
  20. ///<summary> 
  21. ///  
  22. ///</summary> 
  23. ///<paramnameparamname="fileds"></param> 
  24. ///<paramnameparamname="operators"></param> 
  25. ///<paramnameparamname="values"></param> 
  26. ///<paramnameparamname="relations"></param> 
  27. ///<returns></returns> 
  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<conditions.Length;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. }  

實(shí)際上,編譯器是把Linq表達(dá)式編譯成expression tree的形式,我只需要將條件對(duì)象數(shù)組轉(zhuǎn)換為expression tree就可以了。

我先將一個(gè)條件轉(zhuǎn)化為一個(gè)簡(jiǎn)單的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;  

然后組合,變成一個(gè)Linq表達(dá)式,追加到where上。

  1. publicIList<EDM_Resource>FindByGroup(EDM_ResGroupresGroup,
    Condition[]conditions,intfirst,intlimit,outintcount)  
  2. {  
  3. using(ShengjingEDM2Entitiescontext=newShengjingEDM2Entities())  
  4. {  
  5. IQueryable<EDM_Resource>result=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<conditions.Length;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<Func<EDM_Resource,bool>>expr=Expression.
    Lambda
    <Func<EDM_Resource,bool>>(body,parameter);  
  24. resultresult=result.Where<EDM_Resource>(expr);  
  25. }  
  26. resultresult=result.OrderByDescending<EDM_Resource,int>(r=>r.ResourceID);  
  27. count=result.Count<EDM_Resource>();  
  28. returnresult  
  29. .Skip<EDM_Resource>(first)  
  30. .Take<EDM_Resource>(limit)  
  31. .ToList<EDM_Resource>();  
  32. }  

原來(lái)linq這么強(qiáng)大,這么爽,比拼where條件的方法優(yōu)雅多了,開發(fā)效率也是提高不少,而且我發(fā)現(xiàn)性能也不錯(cuò),100萬(wàn)級(jí)的數(shù)據(jù)通過索引和分頁(yè)查詢還算可以。

【編輯推薦】

  1. Linq結(jié)果集形狀概述
  2. Linq存儲(chǔ)過程返回詳解
  3. Linq調(diào)用LoadProducts方法
  4. Linq使用數(shù)據(jù)表簡(jiǎn)單描述
  5. Linq對(duì)象引用簡(jiǎn)單介紹
責(zé)任編輯:佚名 來(lái)源: IT168
相關(guān)推薦

2009-09-11 09:53:16

Linq查詢表達(dá)式

2009-09-17 09:09:50

Lambda表達(dá)式Linq查詢

2009-09-11 09:48:27

Linq Lambda

2009-09-17 14:21:19

LINQ表達(dá)式

2009-09-11 12:32:33

LINQ表達(dá)式

2009-09-09 13:01:33

LINQ Lambda

2009-09-10 15:35:07

LINQ查詢表達(dá)式

2009-09-15 15:18:00

Linq Lambda

2011-10-28 16:34:13

LINQ

2009-09-17 11:08:55

LINQ查詢表達(dá)式

2009-08-27 09:13:28

LINQ查詢表達(dá)式

2009-09-17 09:15:49

Linq表達(dá)式樹

2009-09-07 17:18:33

LINQ查詢表達(dá)式

2009-09-17 10:40:22

Linq Lambda

2009-09-15 17:30:00

Linq Lambda

2009-09-17 09:44:54

Linq Lambda

2009-09-17 14:24:35

LINQ表達(dá)式

2009-09-09 17:14:17

Linq lambda

2009-08-27 09:44:59

C# Lambda表達(dá)

2009-09-16 17:15:57

正則表達(dá)式引擎
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)