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,我使用三个步骤完成这个扩展,大家可以关注代码里的相关实现(如果需要的话我也可以在以后进行说明):

  1. 使用PartialEvaluator将表达式中的常量直接计算出来(例如“3 * 3”表达式将被替换为“9”),同时也会将一些存储在变量中的值使用常量进行替换。
  2. 使用ConditionBuilder将表达式中的常量收集起来,并生成带参数的Condition表达式(例如“[CreateTime] < {0} AND [UserName] <> {1}”)。
  3. 使用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批量删除数据相关推荐

  1. SQL批量删除数据操作

    SQL批量删除数据操作 文章目录 SQL批量删除数据操作 sql语句 DELETE和TRUNCATE区别 sql语句 --删除数据(避免这么写,删除表全部数据) DELETE FROM `studen ...

  2. sql中批量删除数据

    dao层: xml 注意:发现根据id批量删除数据的时候不设置index属性也是可以的 当批量插入的时候那个时候是一个对象那个时候旧需要设置index属性了

  3. mysql批量删除数据库_数据库实现批量删除数据的操作方法(代码实例)

    本篇文章就给大家介绍数据库实现批量删除数据的操作方法.有一定的参考价值,有需要的朋友可以参考一下,希望对你们有所帮助.package com.mescs.baseinfo.utils; import ...

  4. php批量删除例子,php批量删除数据完整实例代码

    php批量删除数据完整实例代码2017-11-11 21:03 网站后台,一般都有相关的数据,以列表的形式来展现,也方便管理. 有些数据,我们可能需要对其批量进行操作,比如删除.更新日期等. 今天小编 ...

  5. java 批量删除数据_一种批量删除数据的方法

    这两天碰见一个比较紧急的生产问题,由于还在处理中,所以暂时不能给出整体描述,但其中涉及的一个问题就是删除一张大表中的过期历史数据,针对不同的类型的表可能有不同的解决方法,比如若是按照时间做的分区表,d ...

  6. Mybatis 如何批量删除数据

    Mybatis如何批量删除数据 本期以最常用的根据id批量删除数据为例: 接口设计1:List类型单参数 Integer deleteByIds(List<Integer> ids); 接 ...

  7. Oracle中批量删除数据

    在一个ORACLE数据库运行过程中,有时候会遇到要批量删除数据的情况,如一个保存历史数据的表中有大量的数据已经不需要保留,要将这部分数据删除.以下就这种情况可以采取的方法进行讨论.   1.使用TRU ...

  8. 如何在Oracle中批量删除数据

    在一个ORACLE数据库运行过程中,有时候会遇到要批量删除数据的情况,如一个保存历史数据的表中有大量的数据已经不需要保留,要将这部分数据删除. 以下就这种情况可以采取的方法进行讨论. 1.使用TRUN ...

  9. think php批量删除代码,ThinkPHP实现批量删除数据的代码实例

    ThinkPHP实现批量删除数据的代码实例 ThinkPHP实现批量删除数据原理很简单,只需在模板页面里面写上这样传过来就是一个数组,action的删除函数del()如下: /** **删除函数支持删 ...

  10. 【RecyclerView】 十一、RecyclerView 数据更新 ( 删除单条数据 | 批量删除数据 )

    文章目录 一.删除单条数据 二.批量删除数据 三.完整代码示例 四.RecyclerView 相关资料 一.删除单条数据 删除单条数据 : 调用 RecyclerView.Adapter 的 void ...

最新文章

  1. 与 Linux 一起学习:学习打字
  2. 乔春洋:话说文化模式
  3. WWDC 2018:iOS 12 通知的新特性
  4. LayoutInflater中调用系统服务
  5. mac 安装mysql怎么卸载不干净_CleanMyMac卸载不干净怎么办?如何彻底删除Mac上的CleanMyMac?...
  6. Springboot Mybatis使用PageHelper实现分页查询
  7. 指静脉识别技术在安防行业的应用前景
  8. 阿里巴巴在内蒙古旱区试水物联网灌溉技术,一年省出1.5个西湖 1
  9. Python疑难问题:「」与list()哪个快?为什么快?
  10. macbook 放flash发烫,转html5
  11. date命令 简单使用
  12. 二等水准数据平差_二等水准点高程平差计算表(1)
  13. 医药行业数据分析软件(含非付费)--对比分析
  14. 浅谈企业信息化规划建设
  15. 《超越对手-大项目售前售后的30种实战技巧》读书心得
  16. 在到达胜利之前无法回头
  17. 微程序控制器之微程序控制器构成
  18. python 随手记
  19. linux yum install 失败报错:Transaction check error
  20. c语言农历的算法,农历一百年算法(1921~2021)【C语言代码】

热门文章

  1. .net知识和学习方法系列(十七)CLR-CLR中的值类型和引用类型
  2. WinAPI: Rectangle - 绘制矩形
  3. Visual studio 2010 中文SP1 无法安装Silverlight5 Beta Tools的解决办法
  4. Node.js 中 exports 和 module.exports 的区别
  5. C#开发高亮语法编辑器(一)——TextBox ,RichTextBox的局限性
  6. python 并发编程 多线程 守护线程
  7. Maven常用命令汇总
  8. Hdu 1794 【二维成段更新】.cpp
  9. [转]C++日志系统log4cxx使用总结
  10. [MATLAB]MATLAB中SIMULINK常用命令表