写点什么

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

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

关注

评论

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

使用 TiDB Vector 搭建 RAG 应用 - TiDB 文档问答小助手

TiDB 社区干货传送门

版本测评 新版本/特性解读 数据库前沿趋势

多点数千套集群实践:从“MySQL 又不是不能用,为什么选择 TiDB?”到“能用 TiDB 就不用 MySQL”

TiDB 社区干货传送门

实践案例 社区活动 管理与运维 TUG 话题探讨 数据库前沿趋势

FT-FMEA融合混沌演练,零售运营系统韧性架构在线验证实践

华为云开发者联盟

开发 华为云 华为云开发者联盟 确定性运维 企业号2024年5月PK榜

故障排查难?xpu_timer 让大模型训练无死角!

可信AI进展

TiDB x KubeBlocks 集成案例

TiDB 社区干货传送门

管理与运维

IPQ5322 and IPQ9531-Technical comparison and application analysis

wifi6-yiyi

ipq5322

深入理解Python中的深拷贝与浅拷贝

我再BUG界嘎嘎乱杀

Python 编程语言 后端 开发语言 深拷贝与浅拷贝

如何通过店铺集群实现高效库存规划

第七在线

2024年API趋势,哪些API将增加市场份额?

幂简集成

API

启航TiDB:调试环境搭建(vscode+wsl+pd)

TiDB 社区干货传送门

开发语言 TiDB 源码解读 应用适配

【论文速读】|大语言模型是少样本测试员:探索基于LLM的通用漏洞复现

云起无垠

云计算技术架构揭秘与发展

Finovy Cloud

云计算 云计算架构

聊聊缺陷逃逸率

老张

质量保障 缺陷管理 缺陷预防

全球最大图片社交网站Pinterest为什么会放弃HBase而改用TiDB

TiDB 社区干货传送门

社区活动

开启未来出行新纪元:44.8英寸超视界9K疾速屏智能座舱,高端车载显示技术引领用户体验新变革!

爱极客侠

analyze 采样率是怎么算出来的(v6.5.3)

TiDB 社区干货传送门

TiDB 源码解读 6.x 实践

天翼AI云电脑重塑未来工作方式的利器,邀您5月25日相聚福州!

编程猫

GPT-4o 后 LLM 时代 RTC 需求讨论会丨社区伙伴活动分享

声网

【TiDB 社区升级互助材料】TiDB 版本升级最全材料包

TiDB 社区干货传送门

版本升级

记TiDB学习之路

TiDB 社区干货传送门

社区活动

TiDB Cloud x Datadog 集成案例

TiDB 社区干货传送门

应用适配

Introducing Wallys DR5018M: Achieving Up to 1.5Gbps in Industrial WiFi6 Applications

wallyslilly

ipq5018

聊聊Python多进程

我再BUG界嘎嘎乱杀

Python 编程 后端 多进程 开发语言

数据库与人工智能的关系

悦数图数据库

图数据库

NumPy 分割与搜索数组详解

EquatorCoco

数组 Numpy

通过考证深入了解TiDB

TiDB 社区干货传送门

社区活动 数据库架构选型 学习&认证&课程

如何通过算法触达,高效唤醒沉睡会员?奇点云“向价值进发”直播回顾

先锋IT

多点 x TiDB:在出海多云多活架构中,多点运维 TiDB 的实战分享

TiDB 社区干货传送门

实践案例 社区活动

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