大家好,许久没在这里更新了。这段时间又发生了很多事,我被公司派去美国丹佛工作了两个月,去年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的系列。谢谢