写点什么

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

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

关注

评论

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

“整洁架构”和商家前端的重构之路

得物技术

架构 前端 重构

三步就能在OpenHarmony中实现车牌识别

OpenHarmony开发者

OpenHarmony

ORACLE进阶(四)表连接讲解

No Silver Bullet

oracle 7月月更 表连接

提前解锁 2 大直播主题!今天手把手教你如何完成软件包集成?|第 29-30 期

OpenAnolis小助手

云原生 直播 龙蜥大讲堂 SIG 双周会 CSI 与 open-local

【鲲鹏BoostKit】OminiRuntime ——高效统一的大数据分析Runtime底座

极客天地

终于可以一行代码也不用改了!ShardingSphere 原生驱动问世

SphereEx

数据库 ShardingSphere ShardingSphere-JDBC

Android 查看签名

沃德

程序员 7月月更

关于静态类型、动态类型、id、instancetype

NewBoy

前端 移动端 iOS 知识体系 7月月更

案例 ①|主机安全建设:3个层级,11大能力的最佳实践

青藤云安全

网络安全 主机安全 网络安全、攻防演练

Python|数据结构——字典和集合

AXYZdong

Python 7月月更

用Java写学生登陆认证系统

魏铁锤

C#/VB.NET 给PDF文档添加文本/图像水印

在下毛毛雨

C# .net PDF 添加水印

Scala 基础 (五):面向对象(上篇)

百思不得小赵

scala 大数据 oop 7月月更

AddressSanitizer 技术初体验

焱融科技

内存泄露 存储 文件存储 分布式文件存储

beegfs高可用模式探讨

姚华

HPC beegfs 并行文件系统

node の SQLite

空城机

sqlite Node 7月月更

redisson bug分析

wgy

Java redis redisson

视频化全链路智能上云?一文详解什么是阿里云视频云「智能媒体生产」

阿里云CloudImagine

人工智能 媒体 音视频

《数字经济全景白皮书》保险数字化篇 重磅发布

易观分析

保险数字化

基本磁盘与动态磁盘 RAID磁盘冗余阵列区分

Albert Edison

7月月更

CSS 基于文字的图片马赛克你见过吗

南城FE

CSS 前端 马赛克 7月月更

如何提高网站权重

源字节1号

微信小程序 软件开发 网站开发

渲大师携手向日葵,远控赋能云渲染及GPU算力服务

Finovy Cloud

渲染 GPU算力

A5000 vGPU显示模式切换

姚华

显卡、gpu

设计你的安全架构OKR

I

安全架构师 安全架构 企业安全 安全治理

LSF 集群全面监控!浅析 HPC 基于龙蜥操作系统的迁移替代解决方案

OpenAnolis小助手

开源 解决方案 龙蜥操作系统 常青藤开源科技 HPCinsights

Java多线程案例之阻塞队列

未见花闻

7月月更

CRMEB 商城系统如何助力营销?

CRMEB

SAP Fiori 应用索引大全工具和 SAP Fiori Tools 的使用介绍

汪子熙

SAP Fiori SAP UI5 ui5 7月月更

LeetCode-155. 最小栈(java)

bug菌

Leet Code 7月月更

小程序在产业互联网中的作用

Geek_99967b

小程序 小程序容器

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