LINQ to SQL之使用Lambda Expression批量删除数据
ORM框架在删除数据方面一直有个尴尬,那就是无法通过指定条件批量删除数据(当然这本不是ORM的问题,只是使用上感觉不方便)。于是对于一些删除操作,我们不得不写SQL语句或者执行存储过程,例如:
ItemDataContext db = new ItemDataContext();
db.ExecuteCommand(
"DELETE FROM Item WHERE [CreateTime] < {0}",
DateTime.UtcNow.AddMonths(-1));
我始终认为,在程序里出现直接的SQL语句是一件很丑陋的事情。在我看来,数据库操作应该被封装起来,而对于应用层的开发人员来说,眼中应该只有对象——退一步的话也可向数据库发送指令(就是使用存储过程)。当然,这是理想状态,值得追求,但不可强求。幸运的是C# 3.0所拥有的强大特性足以让我们对LINQ to SQL的功能进行扩展。为了更好地进行项目开发,我为LINQ to SQL扩展了批量删除功能。当项目中引用了这个扩展之后,我们就可以使用如下的代码来实现上面的功能了:
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");
之前我对于LINQ to SQL的扩展大都基于DataContext,不过很明显,这次的扩展是基于Table<T>的。总的来说,这个扩展比我想象中要简单不少。针对LINQ的扩展最麻烦的地方就在于解析表达式树(Expression Tree),而这个扩展关键的就是二元表达式(BinaryExpression),除了这点就没有太大问题了——当然,这也是因为我放弃了对于复杂表达式树的解析,例如现在就不支持“item.Introduction.Length < 10”这种条件,而对于更完整的解析方式来说,应该将其转化为T-SQL中的LEN函数。
这个扩展的关键在于根据表达式树生成Where Condition,我使用三个步骤完成这个扩展,大家可以关注代码里的相关实现(如果需要的话我也可以在以后进行说明):
- 使用PartialEvaluator将表达式中的常量直接计算出来(例如“3 * 3”表达式将被替换为“9”),同时也会将一些存储在变量中的值使用常量进行替换。
- 使用ConditionBuilder将表达式中的常量收集起来,并生成带参数的Condition表达式(例如“[CreateTime] < {0} AND [UserName] <> {1}”)。
- 使用DataContext.ExecuteCommand方法执行完整的SQL语句。
有了批量删除的功能,那么还缺点什么呢?那自然就是批量更新的功能了。批量更新的功能比删除略为复杂一些,我正在开发之中。在有了这个扩展之后,我们就可以使用如下的方法进行批量更新了:
ItemDataContext db = new ItemDataContext();
db.Items.Update(
item => new Item
{
Introduction = item.Title + "Hello World",
ViewCount = item.ViewCount + 1,
}, // 更新方式
item => item.CommentCount > 100 /* 更新条件 */);
主要参考文章链接:http://www.cnblogs.com/JeffreyZhao/archive/2008/03/05/LINQ-to-SQL-Batch-Delete-Extension.html
转载于:https://www.cnblogs.com/alexworks/articles/1619160.html
LINQ to SQL之使用Lambda Expression批量删除数据相关推荐
- SQL批量删除数据操作
SQL批量删除数据操作 文章目录 SQL批量删除数据操作 sql语句 DELETE和TRUNCATE区别 sql语句 --删除数据(避免这么写,删除表全部数据) DELETE FROM `studen ...
- sql中批量删除数据
dao层: xml 注意:发现根据id批量删除数据的时候不设置index属性也是可以的 当批量插入的时候那个时候是一个对象那个时候旧需要设置index属性了
- mysql批量删除数据库_数据库实现批量删除数据的操作方法(代码实例)
本篇文章就给大家介绍数据库实现批量删除数据的操作方法.有一定的参考价值,有需要的朋友可以参考一下,希望对你们有所帮助.package com.mescs.baseinfo.utils; import ...
- php批量删除例子,php批量删除数据完整实例代码
php批量删除数据完整实例代码2017-11-11 21:03 网站后台,一般都有相关的数据,以列表的形式来展现,也方便管理. 有些数据,我们可能需要对其批量进行操作,比如删除.更新日期等. 今天小编 ...
- java 批量删除数据_一种批量删除数据的方法
这两天碰见一个比较紧急的生产问题,由于还在处理中,所以暂时不能给出整体描述,但其中涉及的一个问题就是删除一张大表中的过期历史数据,针对不同的类型的表可能有不同的解决方法,比如若是按照时间做的分区表,d ...
- Mybatis 如何批量删除数据
Mybatis如何批量删除数据 本期以最常用的根据id批量删除数据为例: 接口设计1:List类型单参数 Integer deleteByIds(List<Integer> ids); 接 ...
- Oracle中批量删除数据
在一个ORACLE数据库运行过程中,有时候会遇到要批量删除数据的情况,如一个保存历史数据的表中有大量的数据已经不需要保留,要将这部分数据删除.以下就这种情况可以采取的方法进行讨论. 1.使用TRU ...
- 如何在Oracle中批量删除数据
在一个ORACLE数据库运行过程中,有时候会遇到要批量删除数据的情况,如一个保存历史数据的表中有大量的数据已经不需要保留,要将这部分数据删除. 以下就这种情况可以采取的方法进行讨论. 1.使用TRUN ...
- think php批量删除代码,ThinkPHP实现批量删除数据的代码实例
ThinkPHP实现批量删除数据的代码实例 ThinkPHP实现批量删除数据原理很简单,只需在模板页面里面写上这样传过来就是一个数组,action的删除函数del()如下: /** **删除函数支持删 ...
- 【RecyclerView】 十一、RecyclerView 数据更新 ( 删除单条数据 | 批量删除数据 )
文章目录 一.删除单条数据 二.批量删除数据 三.完整代码示例 四.RecyclerView 相关资料 一.删除单条数据 删除单条数据 : 调用 RecyclerView.Adapter 的 void ...
最新文章
- 与 Linux 一起学习:学习打字
- 乔春洋:话说文化模式
- WWDC 2018:iOS 12 通知的新特性
- LayoutInflater中调用系统服务
- mac 安装mysql怎么卸载不干净_CleanMyMac卸载不干净怎么办?如何彻底删除Mac上的CleanMyMac?...
- Springboot Mybatis使用PageHelper实现分页查询
- 指静脉识别技术在安防行业的应用前景
- 阿里巴巴在内蒙古旱区试水物联网灌溉技术,一年省出1.5个西湖 1
- Python疑难问题:「」与list()哪个快?为什么快?
- macbook 放flash发烫,转html5
- date命令 简单使用
- 二等水准数据平差_二等水准点高程平差计算表(1)
- 医药行业数据分析软件(含非付费)--对比分析
- 浅谈企业信息化规划建设
- 《超越对手-大项目售前售后的30种实战技巧》读书心得
- 在到达胜利之前无法回头
- 微程序控制器之微程序控制器构成
- python 随手记
- linux yum install 失败报错:Transaction check error
- c语言农历的算法,农历一百年算法(1921~2021)【C语言代码】
热门文章
- .net知识和学习方法系列(十七)CLR-CLR中的值类型和引用类型
- WinAPI: Rectangle - 绘制矩形
- Visual studio 2010 中文SP1 无法安装Silverlight5 Beta Tools的解决办法
- Node.js 中 exports 和 module.exports 的区别
- C#开发高亮语法编辑器(一)——TextBox ,RichTextBox的局限性
- python 并发编程 多线程 守护线程
- Maven常用命令汇总
- Hdu 1794 【二维成段更新】.cpp
- [转]C++日志系统log4cxx使用总结
- [MATLAB]MATLAB中SIMULINK常用命令表