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

posted on 2012-03-25 17:12  Edward.Zhan  阅读(2792)  评论(10编辑  收藏  举报