写点什么

扩展 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:093206
用户头像

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

关注

评论

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

一文详解安全随机数

华为云开发者联盟

安全 华为云 华为云开发者联盟

人工智能 | 数据驱动的机器学习:智能系统如何学习

测吧(北京)科技有限公司

测试

揭秘可解释性人工智能的关键

测吧(北京)科技有限公司

测试

MySQL数据库中SQL语句分几类?

小魏写代码

Solidity之旅(七)单位以及全局变量

BSN研习社

做服务的架构陷阱,你掌握了多少

华为云开发者联盟

后端 开发 华为云 华为云开发者联盟

低代码正在改变软件开发方式

互联网工科生

软件开发 低代码 JNPF

使用 KubeRay 和 Kueue 在 Kubernetes 中托管 Ray 工作负载

字节跳动云原生计算

ray KubeRay

亚马逊云科技宣布推出三项无服务器服务创新

财见

人工智能 | 机器视觉:计算机如何解读图像

测吧(北京)科技有限公司

测试

人工智能助力创意产业:创新的引擎

测吧(北京)科技有限公司

测试

鹏华基金核心系统完成国产化升级,腾讯云大数据TBDS再拓应用新场景

腾讯云大数据

TBDS

搭建本地http服务器-打开本地文件

Lemoon Can

notion链接脑图 mac开机自启动服务 打开本地文件的http服务器

文心一言 VS 讯飞星火 VS chatgpt (151)-- 算法导论12.2 7题

福大大架构师每日一题

福大大架构师每日一题

【腾讯云 HAI域探秘】整合腾讯云HAI的ChatGLM模型到NUXT官网:实现智能IM功能

攀登者

未雨绸缪,天翼云云备份护航企业稳健发展

极客天地

去哪儿如何实现故障率降低65%?技术+管理的数字化度量体系实践

TakinTalks稳定性社区

在使用item_get API时,如何处理重复的商品信息?

技术冰糖葫芦

API 接口

人工智能 | 机器视觉:揭秘计算机如何解读图像的奥秘

测吧(北京)科技有限公司

测试

生产环境质量保障的四大挑战

老张

质量保障 测试右移

【EMNLP 2023】面向垂直领域的知识预训练语言模型

阿里云大数据AI技术

人工智能的基础概念与原理

测吧(北京)科技有限公司

测试

人工智能 | 计算机如何理解和生成人类语言

测吧(北京)科技有限公司

测试

人工智能 | 揭秘计算机如何理解和处理人类语言

测吧(北京)科技有限公司

测试

如何最大化利用虚拟主机:实用技巧与建议

一只扑棱蛾子

虚拟主机

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