写点什么

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

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

关注

评论

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

Docker 镜像的导出与导入

陈皮

Docker save load

前、后端通用的可视化逻辑编排

悠闲的水

低代码 逻辑编排 低代码平台 可视化编排 可视化开发

你的极狐GitLab SaaS上开启这些设置了吗?代码安全,安心下班!

极狐GitLab

gitlab CI/CD DevSecOps 代码安全 软件供应链安全

Spring高手之路1——深入理解与实现IOC依赖查找与依赖注入

砖业洋__

ioc 依赖注入 spring框架 依赖查找 IOC面试题

Spring高手之路2——深入理解注解驱动配置与XML配置的融合与区别

砖业洋__

XML配置 spring框架 注解驱动配置 组件注册 组件扫描

第四届“先导杯”全国挑战赛正式开赛 百万奖金等你来拿

科技热闻

掌控MySQL并发:深度解析锁机制与并发控制

砖业洋__

表锁 MySQL并发控制 隐式锁 插入意向锁 行锁

AI绘图:艺术与科技的交融 | 社区征文

IT蜗壳-Tango

年中技术盘点

Python爬虫超详细讲解(零基础入门,老年人都看的懂)

Java随想录

Java Python

英特尔x MAXHUB:以创新解决方案掀起“智能协作”新浪潮

E科讯

我来泼盆冷水:正面迎击AI的时代千万别被ChatGPT割了韭菜

EquatorCoco

人工智能 信息安全 ChatGPT

【有奖互动】开发者版本新特性,你期待哪些更新?#HDC.Together2023#

HarmonyOS开发者

HarmonyOS

2023-07-20:假设一共有M个车库,编号1~M,时间点从早到晚是从1~T, 一共有N个记录,每一条记录如下{a, b, c}, 表示一辆车在b时间点进入a车库,在c时间点从a车库出去, 一共有K

福大大架构师每日一题

福大大架构师每日一题

Nautilus Chain 主网上线,创世 ZBC 质押即将开启

EOSdreamer111

AI 改变我们的工作方式 | 社区征文

宇宙之一粟

年中技术盘点

阿里商旅账单系统架构设计实践

阿里技术

账单 阿里商旅 账单系统 账单数据

Nautilus Chain 主网上线,创世 ZBC 质押即将开启

大瞿科技

【Linux系统】fdisk相关分区命令。

百度搜索:蓝易云

云计算 Linux 运维 服务器 fdisk

《中国民用航空业零代码应用与推广白皮书》正式发布

明道云

Nautilus Chain 主网上线,创世 ZBC 质押即将开启

股市老人

英特尔携钉钉及新华三以创新解决方案变革未来远程协作体验

E科讯

2023北京国际数码印花及丝网印刷展览会

吹吹晚风

如何理解小程序插件?微信及支付宝官方详解

没有用户名丶

在 K8S 中只会 CI 不会 CD ?3 种方式,让极狐GitLab 和 K8S 高效协同!

极狐GitLab

DevOps 云原生 k8s CI/CD 集成

如何用极狐GitLab 为 Android App 创建自动化CI/CD?详细教程来了

极狐GitLab

自动化 CI/CD Android; keystore fastlane

[Huggingface]系列文章(1)-认识Transformers

alexgaoyh

文本分类 文本生成 huggingface sentiment-analysis text-generation

C语言 typedef的用法示例讲解

智趣匠

性能最快的代码分析工具,Ruff 正在席卷 Python 圈!

EquatorCoco

Python 开源 框架

新兴技术对中药学的革命|社区征文

爱技术的药学生

AI AIGC 年中技术盘点

AI与HPC融合,未来会朝什么方向发展 | 社区征文

瓜瓜猪

年中技术盘点

Filter for GO

数由科技

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