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:093185
用户头像

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

关注

评论

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

一文了解 AIOps 的含义、特点与功用

Anliven

AIOPS 智能运维 智能运维AIOps

阿里PAI-ChatLearn:大规模 Alignment高效训练框架正式开源

阿里云大数据AI技术

人工智能 开源 LLM Alignment PAI-ChatLearn

浅谈大模型生成类应用的需求分析设计与实践

鲸品堂

文档 大模型 生成式 企业号2024年8月PK榜

飞桨框架3.0核心升级:动静统一自动并行,轻松开发大模型

百度Geek说

百度 百度飞桨 #大模型

智能终端密码模块的三重防护

芯盾时代

信息安全 终端安全 密码

京东商品信息高效抓取:利用API实现数据获取的实战指南

代码忍者

API 测试 API 策略

数业智能心大陆开学 “收心” 全指南

心大陆多智能体

智能体 AI大模型 心理健康 数字心理

TimeWheel 算法介绍及在应用上的探索

vivo互联网技术

dubbo TimeWheel 时间轮模型

LED广告屏深受欢迎的原因分析

Dylan

广告 科技 LED display LED显示屏 零售电商市场

火山引擎数智平台:A/B测试个性化配置能力发布,拓展多场景策略最优解

字节跳动数据平台

大数据 A/B测试 对比实验 数字化增长

嵌入式笔记 day1

万里无云万里天

嵌入式

如何利用 StarRocks 实时分析数据湖中的数据?

镜舟科技

StarRocks 湖仓一体 大数据 开源

996/007:背后的真相

老张

职场成长 996 007 认知 加班文化

深入解析淘宝商品详情API返回值中的商品材质与成分

代码忍者

API 测试 API 策略

基于LangChain手工测试用例转Web自动化测试生成工具

测试人

人工智能 软件测试 测试用例

JDBC类型解析

JDBC count(1) jdbc类型处理

在AI最火热的时候,AI大牛写了本小说

博文视点Broadview

OpenAI“草莓项目”最快今年秋季发布!苹果将于9月10号推出首款AI iPhone|AI日报

可信AI进展

MySQL 延迟从库介绍

Simon

MySQL MySQL主从复制

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