NVIDIA 初创加速计划,免费加速您的创业启动 了解详情
写点什么

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

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

关注

评论

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

【Metaverse系列二】3D引擎知多少

ThingJS数字孪生引擎

元宇宙

人非圣贤孰能无过,Go lang1.18入门精炼教程,由白丁入鸿儒,Go lang错误处理机制EP11

刘悦的技术博客

Go Go web go语言 Go 语言

华能 + Alluxio | 数字化浪潮下跨地域数据联邦访问与分析

Alluxio

数字化 国产化 东数西算 大数据 开源 数据编排

深度学习公式推导(1):神经元的数学公式

老崔说架构

应用实例分析——图像检索

Geek_e369a5

图像搜索

明源云参加2022数字化转型发展高峰论坛并获多项殊荣

科技热闻

需求子任务的数据管理提效实践

转转技术团队

开发工具 测试赋能

阿里SpringBoot实战手册横空出世!从此不再是易学难精

冉然学Java

Java 编程 程序员 Spring Boot 构架

《游戏机图鉴》:发展、继承、崩溃、复兴,游戏机的前世今生

图灵教育

面试的朋友听我说,18个MyBatis高频知识及学习笔记,双手奉上

冉然学Java

Java 源码 分布式 mybatis 构架

开源图编辑库 NebulaGraph VEditor 的设计思路分享

NebulaGraph

数据库 图数据库 知识图谱 NebulaGraph

开源一夏 | 为什么应该参与开源项目

baiyutang

开源 架构 微服务 开源文化 CloudWeGo

过等保费用包含哪些?大概多少钱?

行云管家

等保 等级保护 过等保

深入浅出分布式事务的实现原理

清风

面试 分布式事务 后端 原理 事务

华为云SparkRTC面向低时延、大通量传输业务的技术探索

华为云开发者联盟

云计算 后端 华为云

QCN9074, 802.11ax,Wallys, 4x4 MU-MIMO, 6GHz, wifi6E,

wallys-wifi6

QCN9074

Go-Excelize API源码阅读(十)—— SetActiveSheet(index int)

Regan Yue

Go 开源 源码阅读 8月日更 8月月更

数据说|数字经济,山东16市谁最“炫”?排行榜来了

易观分析

数字经济 山东

兆骑科创创新创业服务平台,双创活动承办,企业落地孵化

兆骑科创凤阁

博云入选国家级专精特新「小巨人」名单!

BoCloud博云

云计算 容器 “小巨人”企业

得物黑科技|AR测量脚型,解决尺码烦恼

得物技术

AR

首届腾讯云大数据峰会开幕在即,现场将发布全新一代产品矩阵

科技热闻

字节跳动基于ClickHouse优化实践之Upsert

字节跳动数据平台

OLAP Clickhouse 数据库优化 数据库开发 数据库·

49张图带领小伙伴们体验一把 Flowable-UI

江南一点雨

spring springboot workflow flowable

兆骑科创赛事承办平台,高层次人才引进,创业服务平台

兆骑科创凤阁

阿里IM技术分享(八):深度解密钉钉即时消息服务DTIM的技术设计

JackJiang

架构设计 即时通讯 im开发

从这 5 个 DevOps “恐怖故事”,我们能学到什么?

SoFlu软件机器人

构建元宇宙概念NFT商城系统——艺术数字藏品平台源码部署

开源直播系统源码

软件开发 数字藏品软件开发 数字藏品源码出售

如何成就更高远控帧率和流畅度?向日葵SADDC算法浅析

贝锐

算法 视频解码 视觉策略 远程控制

影响全彩LED显示屏质量的几个因素

Dylan

LED显示屏 全彩LED显示屏 led显示屏厂家

Redis API——List功能实践与性能测试【Go版】

FunTester

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