写点什么

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

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

关注

评论

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

2025加密风云:行业变革与未来趋势全景透视

chainwiseweb3

加密货币 crypto dapp开发 区块链开发DAPP开发 链游开发公链开发

华为云Flexus云服务器X实例之openEuler系统下部署emlog轻量级博客平台

YG科技

亚信科技研发智能化实践之路

阿里巴巴云原生

阿里云 云原生

《计算机组成及汇编语言原理》阅读笔记:p177-p177

codists

计算机组成及汇编语言原理

亚信科技研发智能化实践之路

阿里云云效

阿里云 云原生 通义灵码

2024年12月文章一览

codists

文章一览

华为云Flexus X实例评测使用体验——Anaconda环境安装

YG科技

全面指南:使用华为云Flexus X部署私人图床

YG科技

社区信息化管理系统(源码+文档+部署+讲解)

深圳亥时科技

行业分享丨延锋国际基于数据分析和AI平台的仿真工具探索

Altair RapidMiner

人工智能 数据挖掘 数据分析 AI在仿真应用 ai与cae

VMware ESXi 8.0U3c macOS Unlocker & OEM BIOS 集成驱动版,新增 12 款 I219 网卡驱动

sysin

esxi

云服务器Flexus X实例,镜像切换与服务器压力测试

YG科技

天润融通工单系统:一键催单功能提升客户满意度

天润融通

HarmonyOS next之APP 服务卡片获取 APP 内数据

flfljh

华为云Flexus云服务器X实例部署Trilium Notes知识库工具

YG科技

Java面试突击手册,一周刷完这300道面试题,你也可以当架构师!

Summer

Java 程序员 面试 架构师 大厂

LeetCode题解:2625. 扁平化嵌套数组,递归

Lee Chen

VMware ESXi 8.0U3c macOS Unlocker & OEM BIOS xFusion (超聚变) 定制版

sysin

深入解析华为云X实例保障云上业务安全的关键策略

YG科技

docker 部署kafka及ui搭建

YG科技

FORCE 大会开发者论坛演讲实录|吴一帆:边缘智能在 Agent 上的探索与实践

火山引擎边缘云

智能IoT边缘服务 AI 大底座 大模型、 边缘智能

华为Flexus云服务器X实例实测-零信任访问方案Next Terminal

YG科技

华为云Flexus云服务器X实例之openEuler系统下部署WordPress网站

YG科技

华为云Flexus X实例docker部署Rocket.Chat构建属于自己的团队通讯协作平台

YG科技

EulerOS+Nginx+MySQL部署GLPI资产管理系统

YG科技

阿里拿38K出来的大佬良心分享,熬夜整理10 万字详细Java面试笔记!

Summer

Java 程序员 面试 架构师 大厂

华为云Flexus X实例docker部署ERPnext构建属于自己的企业资源规划系统

YG科技

利用华为云Flexus X实例解决家里公网80和443端口不开放问题

YG科技

Elasticsearch VS Easysearch 性能测试

极限实验室

elasticsearch ES easysearch

DVWA靶场文件上传漏洞全级别通关及源码深度解析

代码忍者

HarmonyOS next之flutter鸿蒙项目初体验

flfljh

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