写点什么

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

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

关注

评论

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

长连接网关技术专题(十二):大模型时代多模型AI网关的架构设计与实现

JackJiang

网络编程 IM 即时通讯IM

推荐系统网络序言

永荣带你玩转昇腾

《腾讯Codebuddy+AI让古诗文教学开挂!语文老师3步搞定智能备课系统》

jimaks

CodeBuddy首席试玩官

CodeBuddy助力数学教学:数学老师直呼内行!

jimaks

CodeBuddy首席试玩官

微软 Azure 发布 Voice Live API,自带音频处理可自选模型;空间语音翻译:保持环境中说话人方向和声音特征丨日报

声网

鸿蒙开发实现图片上传(上传用户头像)

星河特战队员

社交 DevEco Studio 鸿蒙开发 harmoyos

Centos或Linux编写一键式Shell脚本删除用户、组指导手册

刘大猫

人工智能 Linux centos Shell shell脚本

PyTorch 实现FCN网络用于图像语义分割

永荣带你玩转昇腾

基于Pytorch 在昇腾上实现GCN图神经网络

永荣带你玩转昇腾

昇腾910-PyTorch 实现 Vggnet图像分类

永荣带你玩转昇腾

模型并行之Embedding表

永荣带你玩转昇腾

学习如何构建高效AI Agent

Bruce Talk

AI

Cursor要付费,何不试试Trae | Trae 带你做游戏

六月的雨在InfoQ

MCP Trae MCP Server AI 编程

🌟 CodeBuddy Craft智能体实战:开发一个智能语法检查工具

jimaks

CodeBuddy首席试玩官

Arthas heapdump(dump java heap, 类似 jmap 命令的 heap dump 功能)

刘大猫

监控 Arthas 监控工具 heap heapdump

上线 3 天破 500 星,TEN VAD 与 Turn Detection 让 Voice Agent 对话更拟人丨社区来稿

声网

AppAgentx 开源AI手机操控使用分享

溪抱鱼

android AI 自动化测试

常用的CTR领域经典机器模型介绍

永荣带你玩转昇腾

《算法导论(第4版)》阅读笔记:p127-p133

codists

算法

🌟【一句话生成个人主页】CodeBuddy Craft让设计师瞳孔地震!

jimaks

CodeBuddy首席试玩官

【CodeBuddy】挑战一句话开发一个完整项目之:React表单验证系统

jimaks

CodeBuddy首席试玩官

Arthas sysprop(查看和修改JVM的系统属性)

刘大猫

JVM 监控 Arthas 监控工具 sysprop

以利他共赢实现和合共生珠海万达商管东区品牌峰会圆满举办

新消费日报

使用手势自定义截取视频时间组件

鸿蒙 开发工具 HarmonyOS HarmonyOS NEXT 实践分享

CodeBuddy Craft智能体测评|对话式编程太香了!🚀

jimaks

CodeBuddy首席试玩官

香港通过《稳定币条例草案》,京东币链科技解读 「里程碑时刻」

TechubNews

京东稳定币 稳定币条例草案 香港稳定币草案

楼宇大堂数字LED显示屏定制指南

Dylan

商业 LED显示屏 全彩LED显示屏 户外LED显示屏 led显示屏厂家

全面解析 Coco AI,一款开源、免费的智能搜索与知识库工具

极限实验室

直播 CocoAI

PID参数自整定终极指南:基于继电反馈的智能调节算法详解

芯动大师

PID 自整定

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