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