大家好,許久沒在這里更新了。這段時間又發生了很多事,我被公司派去美國丹佛工作了兩個月,去年12月20號左右回的國。另外今年3月我次換了東家,現在在深圳穆迪工作,繼續從事.net開發。
好了,進入正題。
這一節作為表達式樹的完結篇,我將上傳一些我寫的案例與做一些總結。其實之前我在惠普的COE(Center of Expert)也做過為期2節的關於表達式樹的training,這一節中的案例也是我那時training時寫的。
OK,先上案例
案例1:動態查詢
在實際項目中,我們可能有如下需求:
對一個本地數據源,我們可能希望運行時動態來確定查詢條件。比如給用戶一個textbox,
本地數據源為一個list,list中每一項的數據結構定義如下:
{
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:驗證。
在實際的項目開發中,我們往往需要驗證一個層級很深的屬性是否為空,而為了驗證這個屬性,我們往往要寫很多繁瑣的代碼區一步一步該屬性的父對象是否為空,所以我們往往需要寫類似如下的代碼:
&& this.UpdateWBPanelInfoRQ.POS != null
&& this.UpdateWBPanelInfoRQ.POS.Length > 0
&& this.UpdateWBPanelInfoRQ.POS[ 0] != null
&& ! string.IsNullOrEmpty( this.UpdateWBPanelInfoRQ.POS[ 0].AirlineVendorID);
有沒有一種辦法,讓我們寫類似如下的代碼,而做驗證的時候把每一級的對象都驗證是否為空呢?
就比如我們寫了這段代碼,希望能先驗證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的系列。謝謝