C# Lambda Expression使用实例解析

开发 后端
C# Lambda Expression的使用主要是我们LINQ to SQL的实际应用中处理数据的时候会碰到,那么C# Lambda Expression的出现会给我们带来什么好处呢?那么本文就向你介绍详细的内容。

我们在LINQ to SQL的实际开发应用中C# Lambda Expression的使用是什么情况呢?尤其是ORM框架使用时会碰到在删除数据方面的一些问题,就是使用特定条件无法批量删除数据。那么如何解决这种问题呢?那么这里向你提供了一点思路,希望对你有所帮助。

我们处理一些删除操作,会选择写SQL语句或者执行存储过程,例如:

  1. ItemDataContext db = new ItemDataContext();  
  2. db.ExecuteCommand(  
  3. "DELETE FROM Item WHERE [CreateTime] < {0}",   
  4. DateTime.UtcNow.AddMonths(-1)); 

C# Lambda Expression的出现

在程序里出现直接的SQL语句是一件很丑陋的事情。在我看来,数据库操作应该被封装起来,而对于应用层的开发人员来说,眼中应该只有对象——退一步的话也可向数据库发送指令(就是使用存储过程)。当然,这是理想状态,值得追求,但不可强求。幸运的是C# 3.0所拥有的强大特性足以让我们对LINQ to SQL的功能进行扩展。为了更好地进行项目开发,以及周五的一次技术交流,我为LINQ to SQL扩展了批量删除功能。当项目中引用了这个扩展之后,我们就可以使用如下的代码来实现上面的功能了:

  1. ItemDataContext db = new ItemDataContext();  
  2. db.Items.Delete(item =>   
  3. item.CreateTime < DateTime.UtcNow.AddMonths(-1)); 

当然,扩展还支持更复杂的删除条件,例如:

  1. ItemDataContext db = new ItemDataContext();  
  2. db.Items.Delete(item =>  
  3. item.CreateTime < DateTime.UtcNow.AddMonths(-1) ||   
  4. item.ViewCount < item.CommentCount && item.UserName != "jeffz");  

之前我对于LINQ to SQL的扩展大都基于DataContext,不过很明显,这次的扩展是基于Table<T>的。总的来说,这个扩展比我想象中要简单不少。针对LINQ的扩展最麻烦的地方就在于解析表达式树(Expression Tree),而这个扩展关键的就是二元表达式(BinaryExpression),除了这点就没有太大问题了——当然,这也是因为我放弃了对于复杂表达式树的解析,例如现在就不支持“item.Introduction.Length < 10”这种条件,而对于更完整的解析方式来说,应该将其转化为T-SQL中的LEN函数。

C# Lambda Expression的使用:

这个扩展的关键在于根据表达式树生成Where Condition,我使用三个步骤完成这个扩展,大家可以关注代码里的相关实现(如果需要的话我也可以在以后进行说明):

◆使用PartialEvaluator将表达式中的常量直接计算出来(例如“3 * 3”表达式将被替换为“9”),同时也会将一些存储在变量中的值使用常量进行替换。

◆使用ConditionBuilder将表达式中的常量收集起来,并生成带参数的Condition表达式(例如“[CreateTime] < {0} AND [UserName] <> {1}”)。

◆使用DataContext.ExecuteCommand方法执行完整的SQL语句。

有了批量删除的功能,那么还缺点什么呢?那自然就是批量更新的功能了。批量更新的功能比删除略为复杂一些,我正在开发之中。在有了这个扩展之后,我们就可以使用如下的方法进行批量更新了:

  1. ItemDataContext db = new ItemDataContext();  
  2. db.Items.Update(  
  3. item => new Item  
  4. {  
  5. Introduction = item.Title + "Hello World",  
  6. ViewCount = item.ViewCount + 1,  
  7. }, // 更新方式  
  8. item => item.CommentCount > 100 /* 更新条件 */); 

原文来自:http://www.cnblogs.com/zhanglxun/archive/2009/04/21/1440351.html

C# Lambda Expression的使用实例就向你介绍到这里,对于C# Lambda Expression的使用讲解希望对你的开发有所帮助。

【编辑推荐】

  1. LINQ删除记录的操作实现
  2. 实现LINQ删除数据的巧妙方法
  3. 详解实现LINQ to SQL删除行
  4. C# Lambda Expression概念浅析
  5. 详解C# Lambda表达式的动态生成
责任编辑:仲衡 来源: 博客园
相关推荐

2009-09-14 13:44:14

Lambda ExprC# Lambda

2009-09-09 14:40:15

C# XML解析

2009-08-18 10:47:40

C#枚举类型

2009-09-09 13:57:28

C# XML解析

2009-08-19 16:09:15

C#操作Access

2009-08-26 12:14:44

C#打印设置

2009-08-31 18:17:32

C#接口编程

2009-09-07 06:31:32

C#窗体移动

2009-08-28 12:31:06

C#静态方法

2009-08-27 17:40:21

C#接口的作用

2009-08-31 17:16:12

C#实现接口

2009-09-04 13:37:44

C#货币格式

2009-08-31 17:30:10

C#接口的作用

2009-09-03 09:16:35

C#递归函数

2009-09-01 13:51:51

C#创建Word文档

2009-09-01 18:32:32

C#动态数组

2009-09-03 15:43:21

C#时间计算

2011-05-20 17:50:45

C#

2009-08-27 15:17:18

C# interfacinterface使用

2009-08-28 15:37:22

C#线程类的定义
点赞
收藏

51CTO技术栈公众号