<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      c# 經(jīng)驗談:巧用Expression表達(dá)式 解決類似于sql中 select in 的查詢(適合于中小型項目)

      我們在項目經(jīng)常會碰到一些特殊需求 例如下拉框是復(fù)選的,查詢條件是根據(jù)下拉框中復(fù)選項進(jìn)行拼接

      看到此圖后大家肯定會說,這很簡單嘛

      將所有的選項 拼成“'1-3','5-9'”  然后放到 in 的字句后面,一查就出來了。

      這樣做的確在邏輯上沒有問題,可是大家有沒有想過這個問題,過度的和業(yè)務(wù)耦合雖然能夠解決

      現(xiàn)在的需求但是卻犧牲了代碼優(yōu)雅和可維護(hù)性

       

      其實本文的目的是想利用Expression表達(dá)式在linq查詢中實現(xiàn)一個優(yōu)雅的解決方案,

      同時也會給大家一個用Expression去拼接sql的思路

       

      先上代碼

            public static Expression<Func<T, bool>> GetConditionExpression<T>(string[] options, string fieldName)
      {
      ParameterExpression left = Expression.Parameter(typeof(T), "c");//c=>
      Expression expression = Expression.Constant(false);
      foreach (var optionName in options)
      {
      Expression right = Expression.Call
      (
      Expression.Property(left, typeof(T).GetProperty(fieldName)), //c.DataSourceName
      typeof(string).GetMethod("Contains", new Type[] { typeof(string) }),// 反射使用.Contains()方法
                               s Expression.Constant(optionName)           // .Contains(optionName)
      );
      expression = Expression.Or(right, expression);//c.DataSourceName.contain("") || c.DataSourceName.contain("")
      }
      Expression<Func<T, bool>> finalExpression
      = Expression.Lambda<Func<T, bool>>(expression, new ParameterExpression[] { left });
      return finalExpression;
      }

      我想用逆推的方式說明下這段代碼,其實我們查詢的目的要實現(xiàn)這樣的效果 , someList.where(c=>c.Name.contains("someName")||c.Name.Contains("someName")||...)

      1. 首先我們要確定返回什么樣的表達(dá)式,根據(jù)經(jīng)驗.where后面是需要一個Expression<Func<T, bool>> 這樣的一個表達(dá)式,所以方法的返回類型已經(jīng)能確定下來了

      2. 接下來的任務(wù)是拼接類似于c=>c.Name.Contains("") 這樣的表達(dá)式,按照自左向右的原則,左側(cè)表達(dá)式參數(shù)c很好理解 就是T,那么這個表達(dá)式的參數(shù)也就搞定了,

      可以用Expression.Parameter方法來實現(xiàn),該方法目的是將類型反射并且映射給表達(dá)式中的匿名變量 “c” (也可以理解成將參數(shù)常量封裝成表達(dá)式)

      3. 接著是表達(dá)式右側(cè)的拼接

       再次仔細(xì)看下這段代碼

      Expression right = Expression.Call 

       (                          

           Expression.Property(left, typeof(T).GetProperty(fieldName)),  //c.DataSourceName     首先是反射獲取c的一個屬性                

           typeof(string).GetMethod("Contains", new Type[] { typeof(string) }),// 聲明一個string.Contains的方法     c.DataSourceName.Contains()                反射使用.Contains()方法  

           Expression.Constant(optionName)           //  c.DataSourceName.Contains(optionName)               封裝常量       

       );

        為什么要使用Expression.Call ?

      (因為c.Name.contains 屬于string.contains()這個方法所以我們必須將該方法封裝成表達(dá)式,Expression.Call的功能就是將方法封裝成表達(dá)式

       這時候大家會問contains什么呢? 當(dāng)然常量option雖然是string類型,但是仍需封裝成表達(dá)式,Expression.Constant(optionName) 起到了封裝常量的作用

       于是c=>c.屬性.Contains(常量) 這個表達(dá)式搞定,可是還是有問題:怎么加上“||” ,聰明的你已經(jīng)有了答案,Expression.Or()

       

      4 最后一步當(dāng)然非常關(guān)鍵,就像產(chǎn)品需要通過流水線進(jìn)行包裝組合,表達(dá)式也不例外:

      Expression.Lambda<Func<T, bool>>(expression, new ParameterExpression[] { left });

      對于整個表達(dá)式來說,左側(cè)是參數(shù)表達(dá)式(ParameterExpression),Expression.Lambda就是=>符號,就右側(cè)表達(dá)式和參數(shù)表達(dá)式通過lambda符號進(jìn)行組合,搞定

       

      這樣的話,你只需傳入一個字符串?dāng)?shù)組就能在Linq中實現(xiàn)類似于sql中select in 的效果了,

      很多朋友肯定會問,既然能夠用自定義表達(dá)式搞定,那么可不可以將表達(dá)式的思路用于拼接sql?

      答案是肯定的。但是如果業(yè)務(wù)邏輯非常復(fù)雜,而且難以把握,還是建議用ado 配合存過實現(xiàn)

       

       

      感謝女友一直陪到深夜,讓我堅持把這篇博文寫完,文中如有錯誤,也請大家海涵并且能夠及時告訴我,謝謝!

       

       

       

       

       

       

       

       

       

       

       

       

      posted @ 2012-02-23 02:53  逆時針の風(fēng)  閱讀(8716)  評論(18)    收藏  舉報
      主站蜘蛛池模板: 极品美女扒开粉嫩小泬图片| 亚洲人成网7777777国产| 色爱av综合网国产精品| 99精品国产成人一区二区| 伊人欧美在线| 少妇高潮太爽了在线视频| 国产福利片无码区在线观看| 国产白丝无码免费视频| 九九热视频精选在线播放| 久久精品国产清自在天天线| 无码精品人妻一区二区三区中| 日韩中文字幕国产精品| 国产日本一区二区三区久久| 国产一区二区三区免费观看| 亚洲a免费| 人人人澡人人肉久久精品| 无码乱人伦一区二区亚洲一| 亚洲最大的成人网站| 国产精品高清视亚洲精品| 国产二区三区视频在线| 成人国产精品中文字幕| 狠狠久久五月综合色和啪| 成人免费视频在线观看播放| 国内精品久久久久影院网站| 一区二区免费高清观看国产丝瓜| 国产高清视频在线播放www色| 亚洲日韩av无码一区二区三区| 亚洲码欧洲码一二三四五| 亚洲国内精品一区二区| 精品一区二区三区东京热| 自拍偷区亚洲综合第二区| 国产久9视频这里只有精品| 国产台湾黄色av一区二区| 在线观看亚洲欧美日本| 深夜福利啪啪片| 成人免费ā片在线观看| 日本道不卡一二三区视频| 国产永久免费高清在线| 亚洲综合色成在线观看| 九九久久人妻一区精品色| av无码精品一区二区乱子|