博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Linq系列(9)——表达式树之完结(案例与总结)
阅读量:5108 次
发布时间:2019-06-13

本文共 2103 字,大约阅读时间需要 7 分钟。

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

  这个例子解决该场景下的问题,大家可以下下来看一看,有问题可以与我联系,我的联系方式在上一篇中已提到过。

  

 

   案例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。

    这个例子就解决了这个问题。

    

 

    好了。例子就只补充这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的系列。谢谢

转载于:https://www.cnblogs.com/FlyEdward/archive/2012/03/25/Linq_ExpressionTree9.html

你可能感兴趣的文章
(网卡)混杂模式
查看>>
c++刷题(12/100)无序数组中和为定值的最长子数组
查看>>
Hibernate之二级缓存
查看>>
web前端开发人员和设计师必读文章推荐
查看>>
61. Search for a Range【medium】
查看>>
GNU LD脚本解析
查看>>
crontab 在指定时间范围每隔2小时执行一次和指定时间执行实例
查看>>
习题二2
查看>>
python 优雅的使用正则表达式 ~ 1
查看>>
最全NB-IoT/eMTC物联网解决方案名录汇总
查看>>
jdk1.7和Android Studio2.0的问题
查看>>
sqlserver 锁 - 转
查看>>
网页标题添加图标
查看>>
C++面向对象程序设计的一些知识点(2)
查看>>
Spring是如何处理注解的
查看>>
计算机组成考点随笔2
查看>>
springMVC中文乱码问题
查看>>
测试一下你的T-SQL基础知识-count
查看>>
堆、栈、栈区、堆区四者在数据结构和虚拟内存模型中的区别
查看>>
Oracle 返回结果集 sys_refcursor
查看>>