Linq多表查询条件批量删除

简介:

  前阵写了Linq的单表生成相对Sql执行的批量删除,总觉得删除条件太局限了,并且又不能屏蔽linq的级联条件,这很容易误导一些人。所以想了应该还是要支持才好。呵呵。

     其实思路和上次一样,就是生成Sql,用Linq自身条件组合sql应用,没有什么好说的。组合sql用 EXISTS关键字,组合一个子查询。

DELETE   FROM   [ TableName ]     WHERE     EXISTS ( select  .. from   [ TableName ]    where  query );

 直接上Code:

 
  1. 代码   
  2.  
  3. /// EXISTS  
  4. /// </summary>  
  5. /// <typeparam name="T"></typeparam>  
  6. /// <param name="source"></param>  
  7. /// <param name="query"></param>  
  8. /// <returns></returns>  
  9. public static int Delete<T>(this System.Data.Linq.Table<T> source, Expression<Func<T, bool>> query)  
  10. where T : class  
  11. {  
  12. if (source == null)  
  13. throw new ArgumentException("source");  
  14. if (query == null)  
  15. throw new ArgumentException("query");  
  16. //query = t => true;  
  17. //为空DELETE  FROM [dbo].[test] 全删除;个人觉得为空全删除,很不人道,所以还是抛异常  
  18. System.Data.Linq.DataContext db = source.Context;  
  19. DbCommand cmd= db.GetCommand(source.Where(query));  
  20. string queryStr = cmd.CommandText;  
  21. string sql = "DELETE FROM " + source.Context.Mapping.GetTable(typeof(T)).TableName + " WHERE   EXISTS(" + queryStr+")";  
  22. List<object> dbparams = new List<object>();  
  23. foreach (SqlParameter item in cmd.Parameters)  
  24. {  
  25. SqlParameter p = new SqlParameter(item.ParameterName, item.SqlDbType, item.Size);  
  26. p.Value = item.Value;  
  27. dbparams.Add(item.Value);  
  28. }  
  29. cmd = null;  
  30. return db.ExecuteCommand(sql, dbparams.ToArray());  
  31. }  
  32. 复制代码 

调用方式就很简单了,一个Lamdam表达式,就搞定。比如

Console.Write( DataContext.test.Delete(t => t.id != null||t.name.Contains("qq")&&t.Orders.OrderDate<=DateTime.Now));

例子没有从重写Linq或者扩展Linq表达式出发,因为从这里出发我能力估计还差一筹,呵呵还是我觉得没有必要,这样的实现是否更简单,实现的功能更多些,为何不重用人家MS的东西呢,个人观点而已。






 本文转自 破狼 51CTO博客,原文链接:http://blog.51cto.com/whitewolfblog/834738,如需转载请自行联系原作者


相关文章
|
28天前
|
SQL 关系型数据库 MySQL
MySQL数据库——SQL(3)-DQL(基本查询、条件查询、聚合函数、分组查询、排序查询、分页查询、案例练习)
MySQL数据库——SQL(3)-DQL(基本查询、条件查询、聚合函数、分组查询、排序查询、分页查询、案例练习)
28 0
|
11月前
|
SQL API 数据库
Mybatits-plus实现简单的多表联查和分页操作
mybatits-plus提供了简单的curd单表操作API,可以使用多样的方式实现。但是多表联查的时候,我遇到了一些困难,不可以使用通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错。于是就回归到了Mapper.xml文件,这种方法实现起来简单,也可以实现动态sql,非常方便。
125 0
SQL.查询-多条件-动态条件查询
SQL.查询-多条件-动态条件查询
73 0
SQL.查询-多条件-动态条件查询
SQL.查询-单条件-动态条件查询
SQL.查询-单条件-动态条件查询
104 0
SQL.查询-单条件-动态条件查询