Linq系列(9)——表達式樹之完結(案例與總結)


  大家好,許久沒在這里更新了。這段時間又發生了很多事,我被公司派去美國丹佛工作了兩個月,去年12月20號左右回的國。另外今年3月我次換了東家,現在在深圳穆迪工作,繼續從事.net開發。

  好了,進入正題。

  這一節作為表達式樹的完結篇,我將上傳一些我寫的案例與做一些總結。其實之前我在惠普的COE(Center of Expert)也做過為期2節的關於表達式樹的training,這一節中的案例也是我那時training時寫的。

  OK,先上案例

  案例1:動態查詢

  在實際項目中,我們可能有如下需求:

  對一個本地數據源,我們可能希望運行時動態來確定查詢條件。比如給用戶一個textbox,

  本地數據源為一個list,list中每一項的數據結構定義如下:

 

public  class Flight
    {
         public  string CarrierCode
        {
             get;
             set;
        }

         public  string FlightNumber
        {
             get;
             set;
        }

         public  string FlightStartDate
        {
             get;
             set;
        }

         public  string DepartureStation
        {
             get;
             set;
        }

         public  string AircraftTailNumber
        {
             get;
             set;
        }
    }
     #endregion

     public  enum JoinFunction
    {
        Or,
        And
    }

     public  enum OperatorExpression
    {
        Equal,
        NotEqual
    }
}

 

  好了,這個時候,我們希望根據用戶在文本框中的輸入來動態構建查詢條件。

  比如:CarrierCode==AA 表示 搜索出CarrierCode為AA的所有Flight

  CarrierCode==AA|FlightNumber==0001 表示搜出CarrierCode為AA或者FlightNumber為0001的Flight

  FlightNumber!=0001 表示搜出FlightNumber不為0001的Flight

  FlightNumber!=0001&CarrierCode==CO 表示搜出FlightNumber不為0001且CarrierCode為CO的Flight

  這個例子解決該場景下的問題,大家可以下下來看一看,有問題可以與我聯系,我的聯系方式在上一篇中已提到過。

  /Files/FlyEdward/DynamicQuery.rar

 

   案例2:驗證。

   在實際的項目開發中,我們往往需要驗證一個層級很深的屬性是否為空,而為了驗證這個屬性,我們往往要寫很多繁瑣的代碼區一步一步該屬性的父對象是否為空,所以我們往往需要寫類似如下的代碼:

   

return  this.UpdateWBPanelInfoRQ !=  null
                 &&  this.UpdateWBPanelInfoRQ.POS !=  null
                 &&  this.UpdateWBPanelInfoRQ.POS.Length >  0
                 &&  this.UpdateWBPanelInfoRQ.POS[ 0] !=  null
                 && ! string.IsNullOrEmpty( this.UpdateWBPanelInfoRQ.POS[ 0].AirlineVendorID);

    有沒有一種辦法,讓我們寫類似如下的代碼,而做驗證的時候把每一級的對象都驗證是否為空呢?

   

ValidateExpressionTree( " nullFlight.POS.AirlineVendorIDClass.AirlineVendorID ", nullFlight)

    就比如我們寫了這段代碼,希望能先驗證POS是否為null,再驗證AirlineVendorIDClass是否為null,最后驗證AirlineVendorID是否為null。

    這個例子就解決了這個問題。

    /Files/FlyEdward/ValidateProperty.rar

 

    好了。例子就只補充這2個。

    下面開始寫點總結這個系列的

    1.Linq有2套東西:IEnumerable<T>用於本地數據源。IQueryable<T>用於遠程數據源

    2.本地數據源可直接代入運行時上的邏輯,遠程數據源需要將運行時上的邏輯翻譯成數據源可識別的邏輯。

    3.所以只有遠程數據源需要表達式樹作為翻譯的中間載體,但本地數據源的邏輯也可以用表達式樹的結構進行存儲。

    4.Provider負責把表達式樹翻譯成遠程數據源可識別的邏輯。

    5.表達式樹分body和parameter兩部分

    6.本系列中提供了一個調試時可以查看表達式樹結構的小工具。

    7.本系列中還列舉了部分案例。

 

     好了,這個系列就啰啰嗦嗦寫到這里,記得寫這個系列第一篇的時候,我那時才21歲,還是HP的一個intern,現在我已人在深圳,變成了穆迪的Software Engineer.大家有任何問題都可以通過郵箱和QQ與我聯系,接下來我將寫關於Silverlight和Prism的系列。謝謝


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM