写点什么

扩展 LINQ to SQL 以支持批量删除

  • 2008-04-01
  • 本文字数:1060 字

    阅读完需:约 3 分钟

最近,博客园的老赵在其博客上发表了一篇博客文章,其中谈到了一种扩展LINQ to SQL 以支持批量删除数据的方法,可以让我们方便地利用Lambda 表达式来进行批量删除的操作。

LINQ to SQL 要根据条件批量删除数据,通常的做法都是编写 SQL 语句,并通过 DataContext 的 ExecuteCommand 方法来执行删除操作。这样的方法很直接,但是不够自然,如老赵所说:

我始终认为,在程序里出现直接的 SQL 语句是一件很丑陋的事情。在我看来,数据库操作应该被封装起来,而对于应用层的开发人员来说,眼中应该只有对象——退一步的话也可向数据库发送指令(就是使用存储过程)。

在此之前,老赵也写过类似扩展 LINQ to SQL 的文章,其利用了 LINQ to SQL 中 Translate 方法来修改动态生成的 SQL 语句。不过,这次对于批量删除的扩展,老赵使用 C# 3.0 的新特性——扩展方法,来针对 System.Data.Linq.Table 实现了一个名为 Delete 的扩展方法,在引用了这个扩展包后,就可以通过如下类似的代码来进行批量删除数据的操作:

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

扩展还支持更复杂的删除条件

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

老赵的这种方法,是对 Lambda 的表达式树进行解析后生成 DELETE SQL 的 Where 条件子句。他使用了三个步骤来完成这个解析工作:

  • 使用 PartialEvaluator 将表达式中的常量直接计算出来(例如“3 * 3”表达式将被替换为“9”),同时也会将一些存储在变量中的值使用常量进行替换。
  • 使用 ConditionBuilder 将表达式中的常量收集起来,并生成带参数的 Condition 表达式(例如“[CreateTime] < {0} AND [UserName] <> {1}”)。
  • 使用 DataContext.ExecuteCommand 方法执行完整的 SQL 语句。

而另外一个博主, Black Jack ,在老赵文章的提示下,使用了一种“投机取巧”的方式来生成批量删除数据的 SQL 语句。他的思路是,从 Query 中获取自动生成的 SELECT SQL 语句,并将其改造为 DELETE SQL 语句。改造的时候使用正则表达式来进行查找和替换。关于这种方式的详细做法,可以浏览 Linq to Sql: 批量删除之投机取巧版这篇文章。

对于这种扩展 LINQ to SQL 以支持批量删除的做法,有些人认为还是直接编写 SQL 更方便。然而,越来越多的人都在积极尝试扩展 LINQ to SQL,这样可以让我们既获得 LINQ to SQL 带来的好处,又能实现一些更复杂的功能。

2008-04-01 12:093172
用户头像

发布了 254 篇内容, 共 70.9 次阅读, 收获喜欢 2 次。

关注

评论

发布
暂无评论
发现更多内容

【分布式事务】面试官问我:MySQL中的XA事务崩溃了如何恢复??

冰河

MySQL 分布式事务 一致性 XA

架构师训练营第二周作业2

韩儿

前端不得不懂的架构知识(上)

执鸢者

架构 大前端

软件设计原则

猴子胖胖

软件设计原则

Week 6 作业02

Croesus

java安全编码指南之:序列化Serialization

程序那些事

java安全编码 java安全 java安全编码指南 java代码规范

架构师训练营 - 作业 - 第六周

Max2012

架构师系列之1:UML 系统设计用例图

桃花原记

Week 6 作业01

Croesus

2.8 第二周课后练习

lithium

极客时间 架构师训练

第六周课后练习

天天向上

极客大学架构师训练营

盘点 Mac 上好用的七款软件

彭宏豪95

效率 效率工具 软件 Mac

如何抽取实体关系?——基于依存句法分析的事实三元组抽取

Guanngxu

自然语言处理

第六周总结

fmouse

极客大学架构师训练营

架构师训练营第二周作业1

韩儿

架构师训练营第六周命题作业

成长者

极客大学架构师训练营

架构师系列之2:依赖倒置设计原则

桃花原记

第二周学习总结

lithium

极客大学 架构师训练

第二周作业

CraspLion

训练营第六周作业 2

仲夏

极客大学架构师训练营

week2 框架设计 作业和学习总结

杨斌

架构师训练营 - 第六周总结

一个节点

极客大学架构师训练营

第六周总结

alpha

极客大学架构师训练营

怎么样让自己的博客被谷歌和百度收录!

root

百度 SEO 博客收录 谷歌收录

训练营第六周作业 1

仲夏

极客大学架构师训练营

第六周作业

fmouse

极客大学架构师训练营

架构作业 -- CAP原理

Nick~毓

架构师训练营第 1 期 - 第 6 周课后练习

Anyou Liu

极客大学架构师训练营

CAP原理, Doris 临时失效的处理过程

garlic

极客大学架构师训练营

第二周设计原则

Geek_9527

极客大学架构师课程作业-第二周

井中人

极客大学架构师训练营

扩展LINQ to SQL以支持批量删除_.NET_朱永光_InfoQ精选文章