2天时间,聊今年最热的 Agent、上下文工程、AI 产品创新等话题。2025 年最后一场~ 了解详情
写点什么

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

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

关注

评论

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

可视化工作流程设计RapidMiner Studio for mac 注册激活版

Rose

DashVector + ModelScope 玩转多模态检索

DashVector

数据库 AI 向量检索 大模型

用数据,简单点!奇点云2024 StartDT Day数智科技大会,直播见

奇点云

发布会 奇点云 数据云 分析云

基于串口通信的电子相册设计

芯动大师

Python COF 智能屏

IntelliJ IDEA集成Baidu Comate,商城系统支付交易功能开发实战

阿Q说代码

百度 智能推荐 comate 代码助手 智能编码

照片编辑新高度!Capture One,专业摄影师的首选!

Rose

零成本开发!试试这6个免费的API接口平台

幂简集成

API 免费API接口 免费API 免费API接口平台

音乐弹幕?智能修音?回森K歌社区的创新玩法?(上)

快手技术

商业模式 创新 玩法

Win10-VMware安装CentOS7.5

vinci321

centos win10 vmware 虚拟机

全球厂商之最,华为17篇论文入选国际数据库顶会ICDE

华为云开发者联盟

华为云 华为云GaussDB 华为云开发者联盟 华为云GeminiDB 企业号2024年5月PK榜

灵感与技术的结合,Glyphs 3引领字体设计新潮流!

Rose

提升医疗服务质量的基石:全面解析医疗数据治理

郑州埃文科技

数据治理

AAAI 2024 | 基于由粗到细的视觉表征实现的高效匹配且兼顾性能的跨模态检索

快手技术

快手工程架构治理大揭秘:告别崩溃,提效神器来袭!

快手技术

架构 架构治理

云原生多云多集群Karmada|2024开源之夏8项课题邀您共创

华为云开发者联盟

Kubernetes 云原生 华为云 华为云开发者联盟 企业号2024年5月PK榜

iBarcoder for Mac(条形码生成工具) v3.15.1中文激活版

Rose

加速规模化应用,火山引擎升级金融大模型服务体系

新消费日报

大厂程序员的一天,沉浸式体验Baidu Comate代码助手如何用于面试、代码评审……

申屠鹏会

大模型 Baidu Comate comate

开源啦,Redis跨集群实时数据同步工具

golang 数据库 微服务、 redis 底层原理

AWS Elastic Beanstalk 监控可观测最佳实践

观测云

APM AWS

鸿蒙4.2小版本大亮点,鸿蒙5.0也不远了

FinFish

鸿蒙应用开发 小程序容器技术 鸿蒙Next 鸿蒙5.0 鸿蒙SDK

GitHub天花板!清华大佬纯手码的《python背记手册》火了!

我再BUG界嘎嘎乱杀

Python 后端 软件开发 入门 零基础

快手闪耀VALSE2024:揭秘视频生成技术,展示文生图大模型

快手技术

学术会议 学术论文

半年涨粉1000万!揭秘快意大模型在短视频互动场景中的大规模应用实践!

快手技术

短视频 机器人 #大模型

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