Linq To Sql 简单的单表批量删除

简介:

   今天在网上看到老赵前辈的扩展LINQ to SQL:使用Lambda Expression批量删除数据,我看完了文章,还没有看源代码,我一般都习惯于在看别人的代码前,思考一下如果我来实现我会如何实现。我想了许久操作表达式树操作二元表达式(BinaryExpression)我是肯定困难的,对于表达式类库的了解不多,用了Reflector反射,结果什么都看不见,也许我的Reflector版本低了,没有更新。我就放弃了这种实现方式,我想有没有其他的方式呢?最终我觉得可以操作生成sql执行同样可以达到目的,也许更简单化。

      如何获取sql呢,Linq中有db.GetCommand(IQueryable )方法,DBCommand的CommandText就是sql了,那我们如何获取IQueryable 呢,我的第一感觉就是where方法。所以就有下面的语句了,IQueryable q = source.Where(query).AsQueryable();     DbCommand cmd = db.GetCommand(q);

     现在我们等到了查询sql,如何转化为Delete呢,我用了正则表达式匹配。就得到了下面完全代码:

代码

 现在我们可以进行批量删除了,如:

DataContext.test.Delete(t  =>  t.id  >   0   &&  t.name.Contains( " test " ||   new   string [] {  " 12 " " 34 " " 45 "  }.Contains(t.name) 

&&   t.name.Length  > 1 );

是不是很简单:看看Debug输出的sql:

image

在看一个:

 
 
DataContext.Orders.Delete(t  =>   ! t.EmployeeID1.HasValue);
image

这个扩展中的缺点:

1:只针对对单表操作,不支持linq的连接,如:DataContext.test.Delete(t => t.Orders.OrderID > 0);我这个我认为这个可以通过一个更复杂正则表达式完成。还有一种思路更简洁,就是通过sql server支持的表变量或者是临时表先查询出结果,在根据主键实现删除。也许你会说可以写成存储过程,我个人不喜欢它,我一般尽量在程序中TSQL,移植性好,除非性能考虑采用存储过程。

2:事务处理:在这里只是一个先前的测试Demo,所以么有考虑。我觉得我们可以建立一个类来管理sql语句或者查询条件表达式在调用save方法时候进行内部事务操作(我一般不喜欢将事务显示在外部,因为我觉得事务很费资源,等待时间过长数据库容易崩溃,或者对表的锁定等,不知道这个想法对不对,请大家给个建议)。现在可以在外部事务操作就是有点像ADO.NET了,呵呵麻烦。

优点:

1:可以支持复杂的表达式,想老赵提到的“item.Introduction.Length < 10“,以及后面评论中提到的in、like等。

2:实现简单,操作简单,这是最重要的,代码很容易理解。

3:执行不需要从数据库里取出实体在执行,这是Linq的做法。更符合我们的习惯。我看见在老赵博客最后一个评论说它用EF也实现了批量删除,它的那种方式是取出实体在delete,其实并不是EF特有的,Linq也完全可以实现,就几行代码而已。

   

    还想多写一些优点,暂时就想到这些,有什么Bug或者建议请大家一定要指出。还有就是不知道这样对内存有么有影响,还没有来得及测试。

     我个人觉得其实计算机的东西都是我们生活中简单的问题运用,就在个人的思维了,就和前面讲的老外Linq组合查询的PredicateExtensions类一样。

 

    恩现在赶紧去看看老赵前辈的实现方式了,还没来得及看过一行代码呢,不知对事务、多表的支持如何。



本文转自破狼博客园博客,原文链接:http://www.cnblogs.com/whitewolf/archive/2010/08/04/1791682.html,如需转载请自行联系原作者
目录
相关文章
|
4月前
|
SQL 数据库
SQL Server 单表数据查询
SQL Server 单表数据查询
103 1
|
4月前
|
SQL Serverless
SQL Sever 单表数据查询(下)
SQL Sever 单表数据查询(下)
46 1
|
10月前
|
SQL Java 大数据
Mybatis单表操作之普通操作、模糊查询、分页查询、动态SQL
Mybatis单表操作之普通操作、模糊查询、分页查询、动态SQL
156 0
|
11月前
|
SQL 前端开发 数据库
【Python】单表多功能查询的SQL封装
【Python】单表多功能查询的SQL封装
|
SQL 运维 分布式计算
单表七千六百万数据量(oracle)进行实时汇总,sql很慢客户不能忍一下,该怎么办?
单表七千六百万数据量(oracle)进行实时汇总,sql很慢客户不能忍一下,该怎么办?
222 0
单表七千六百万数据量(oracle)进行实时汇总,sql很慢客户不能忍一下,该怎么办?
|
SQL Java 数据库
一文速学-玩转SQL之执行顺序,单表自连接操作和用法
一文速学-玩转SQL之执行顺序,单表自连接操作和用法
149 0
一文速学-玩转SQL之执行顺序,单表自连接操作和用法
|
SQL Web App开发 关系型数据库
SQL优化 MySQL版 - 单表优化及细节详讲
SQL优化 MySQL版 - 单表优化及细节详讲 单表优化及细节详讲 作者 : Stanley 罗昊 【转载请注明出处和署名,谢谢!】 注:本文章需要MySQL数据库优化基础或观看前几篇文章,传送门: B树索引详讲(初识SQL优化,认识索引):https://www.
1469 0
|
存储 SQL 文件存储
SQL Server利用RowNumber()内置函数与Over关键字实现通用分页存储过程(支持单表或多表结查集分页)
原文:SQL Server利用RowNumber()内置函数与Over关键字实现通用分页存储过程(支持单表或多表结查集分页) SQL Server利用RowNumber()内置函数与Over关键字实现通用分页存储过程,支持单表或多表结查集分页,存储过程如下: /******************/ --Author:梦在旅途(www.
1230 0
|
SQL
SQL 单表多条记录分组查询分页代码
SQL表结构如下图: SQL 分页语句: SELECT TOP 5 *,(select count(*) inum from (select distinct AreaID...
774 0