写点什么

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

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

关注

评论

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

关于 “DevOps 实践的深入剖析:从持续集成到持续交付” 相关内容的详细

Chihiro

#DevOps

如何在`created`生命周期钩子中使用`sessionStorage`实现缓存

Chihiro

缓存 Vue 3

NLLB 与 ChatGPT 双向优化:探索翻译模型与语言模型在小语种应用的融合策略

vivo互联网技术

人工智能 大语言模型 LORA微调

QCon 是一个在软件开发领域具有广泛影响力的技术盛会,以下为你详细介绍:

Chihiro

Qcon

5次登上HackerNews首页,我们怎么做开源运营

小猿姐

开源 Kubernetes 云原生

Idea自动生成注释

Geek_7ubdnf

IDEA

DeepSeek与Playwright结合,利用AI提升自动化测试脚本生成与覆盖率优化

测试人

人工智能

2025年福建企业采购堡垒机选哪家?需要重点考虑哪些因素?

行云管家

网络安全 堡垒机 福建

Squaretest自动生成单元测试

Geek_7ubdnf

squaretest

windows查看端口占用情况

Geek_7ubdnf

端口

支付宝 IoT 设备入门宝典(上)设备管理篇

盐焗代码虾

支付宝 物联网 IoT 设备管理 应用分发

适合小型企业的库存管理工具推荐(含免费、开源)

NocoBase

开源 低代码 无代码 库存管理 小企业发展

面向 Data+AI 的新一代智能数仓平台

阿里云大数据AI技术

大数据 Serverless 数据仓库 SaaS MaxCompute

火语言RPA--配置文件读取

火语言RPA

从文心一言与ChatGPT同时免费,读懂全球AI新周期

脑极体

AI

持续交付的优势有哪些

Chihiro

#DevOps

软件等保测评相关问题汇总

行云管家

网络安全 等保 等保测评

Dbeaver迁移配置

Geek_7ubdnf

DevOps如何实现持续交付

Chihiro

#DevOps

【纯干货】手把手教你测试1688代采下单系统(附真实操作案例)

代码忍者

1688代采集运系统

初创公司使用 AI “码农” Devin 一个月的体验

Baihai IDP

程序员 AI LLM AI Agents Devin

云上玩转DeepSeek系列之二:PAI+DeepSeek,打造智能问答助手

阿里云大数据AI技术

人工智能 最佳实践 rag PAI DeepSeek

QGIS开发的技术难点

北京木奇移动技术有限公司

软件外包公司 GIS开发 QGIS开发

QGIS 的性能优化

北京木奇移动技术有限公司

软件外包公司 GIS开发 QGIS开发

CST均匀头模型和天线SAR比吸收率仿真案例

思茂信息

cst cst电磁仿真 CST软件

面对大量指标、模型,如何在研发度量中兼顾易用性?

思码逸研发效能

研发管理 研发效能 效能管理 研发效能度量 思码逸

LambdaQueryWrapper的使用

Geek_7ubdnf

java 技术提升

NotePad++使用批量替换修改文件格式

Geek_7ubdnf

notepad

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