细说针对C 细说管理
创始人
2024-07-16 05:41:31
0

使用Lambda表达式将会造成Lambda表达式主题部分的代码重复.

  1. var allEmployees = new List() { 
  2. new Employee { 
  3. EmployeeId = 1, Classification = 1, FirstName = "Skin", LastName = "Sen" } };  
  4. var earlyFolks = from e in allEmployees  
  5. where e.MonthlySalary < 4000 && e.Classification == 1 && e.YearsOfService > 20  
  6. select e; 

若每当我们要获取一次不同工薪阶层的数据.就要重复一次.相信久经"高重用,松耦合"定律的你.肯定会想尽办法将其实现高重用,松耦合.在以前方法调用的时代.可能你会将其提炼出

  1. private static bool LowPaidSalaried(Employee e, int salar)  
  2.         {  
  3.    return e.MonthlySalary < salar && e.Classification == 1;  
  4.         } 

这样,每次我们调用的时候,将大大减少代码量,提高可复用性.

  1. var earlyFolks = from e in allEmployee  
  2.     where LowPaidSalaried(e, 4000) && e.YearsOfService > 20  
  3.     select e; 

然而,很不幸的是.在这里.这种重构的方式反倒降低了其可重用性.实际上,***种方法的可重用性比第二种方法更高些.为什么呢?明明已经提炼出重用方法了.这与Lambda表达式的求值,解析以及最终的执行方式有关.

前面的<>里说过.编译器会根据不同的LINQ Provider将Lambda表达式转换成不同的内容来执行.对于LINQ to Object.将转换成委托方法.而LINQ to SQL则是转换成表达式数.在数据迭代时才会转换成SQL语句执行.所以.若我们是在LINQ2SQL或ADO.Net EF中如此重构.编译期通过了.但运行时将出错.因为无法将你的自定义方法转换成相关的SQL语句.,因此.将抛出一个异常.

难道,Lambda表达式就只能重复再重复了吗?当然不是.在这里.延迟执行很好的将其作用发挥得淋漓精致.前面说过.延迟执行保存的并不是值,而是获取值的方法或者步骤.这样,每次我们调用完"获取"数据的方法.实际上.数据还没获得.得到的.只是一系列的"步骤".我们可以在步骤的的基础上再添加步骤.这样.就***的实现了Lambda下的重构.

  1. public static IQueryable LowPaidSalaried(this IQueryable sequence)  
  2.         {  
  3.   return from s in sequence  
  4.  where s.Classification == 1 && s.MonthlySalary < 4000  
  5.                    select s;  
  6.         }var allEmployees = FindAllEmployees();  
  7. var salaried = allEmployees.LowPaidSalaried(); 

这样.只有在需要数据的时候,才会根据"步骤"得到相应的数据.对于IEnumerable,我们可以使用yield return来返回序列.

在复杂的查询中服用Lambda表达式最有效的办法就是封装封闭泛型类型的查询创建扩展方法.通过包含Lambda表达式的小方法叠加"步骤".从而达到最有效的优化.

原文链接:http://www.cnblogs.com/kongyiyun/archive/2010/10/19/1855274.html

【编辑推荐】

 

  1. C# Lambda表达式树浅谈
  2. 理解C#中的Lambda表达式
  3. 浅谈如何使用Lambda表达式做抽象代表
  4. Lambda表达式入门实例
  5. C#窗体位置与大小设置详解

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
Windows恶意软件20年“... 在Windows的早期年代,病毒游走于系统之间,偶尔删除文件(但被删除的文件几乎都是可恢复的),并弹...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
着眼MAC地址,解救无法享受D... 在安装了DHCP服务器的局域网环境中,每一台工作站在上网之前,都要先从DHCP服务器那里享受到地址动...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...