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

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

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

直接上Code:

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

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

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

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

转载于:https://blog.51cto.com/whitewolfblog/834738

Linq多表查询条件批量删除相关推荐

  1. Elasticsearch 2.0以上版本根据条件批量删除Java如何实现

    本文转载自:http://blog.csdn.net/u014039577/article/details/51802078,仅为了个人收藏,请支持原创作者. Elasticsearch在2.0以前版 ...

  2. stackexchange.mysql_StackExchange.Redis加载Lua脚本进行模糊查询的批量删除和修改

    前言 使用StackExchange.Redis没有直接相关的方法进行模糊查询的批量删除和修改操作,虽然可以通过Scan相关的方法进行模糊查询,例如:HashScan("hashkey&qu ...

  3. MyBatisPlus一对多分页查询处理主表子表查询条件

    业务上遇到了一个问题,需要进行一对多的分页查询,同时还存在对主表和子表的条件限制,经过查询后参考其他人的经验进行了处理,记录如下. 其中的坑就是正常的分页查询下,一对多的分页是错误的,它不会按主表的查 ...

  4. SpringBoot整合Mybatis之各种查询、模糊查询、批量删除、动态表名

    一.普通查询 1. 若查询出的数据只有一条 a>可以通过实体类对象接收 <!-- Dish getDishByName(@Param("name") String na ...

  5. Linux命令:MySQL系列之五--SELECT单表查询、多表查询升级及删除,插入

    SELECT:查询 SELECT select-list FROM tb WHERE qualification  根据标准qualification查找对应的行 查询语句类型:  qualifica ...

  6. Redis模糊查询及批量删除key

    Redis模糊查询及标题批量删除key 一.登录redis,常用操作 登录本机redis服务器:redis-cli 输入密码验证:auth password 查看所有key:keys * 设置key: ...

  7. C# LINQ 多表查询

    在C#中使用linq实现多表查询,首先需要在c#中连接你的数据库 首先我们先创建一个数据库和两个数据表 然后在表中插入数据设置完毕后到c#中 把数据库创建完毕后在main函数中连接字符串也就是连接自己 ...

  8. Delete By Query API 条件批量删除

    转载:https://blog.csdn.net/wwd0501/article/details/78812873 之前在 2.X版本里 这个Delete By Query功能被去掉了 因为官方认为会 ...

  9. 编写一个 SQL 查询,来删除 Person表中所有重复的电子邮箱,重复的邮箱里只保留 Id 最小 的那个。

    题目 编写一个 SQL 查询,来删除 Person表中所有重复的电子邮箱,重复的邮箱里只保留 Id 最小的那个. Id Email 1 john@example.com 2 bob@example.c ...

最新文章

  1. ArcGIS API for javascript开发笔记(五)——GP服务调用之GP模型的发布及使用详解...
  2. 打开服务器数据库文件,如何打开服务器中的数据库文件
  3. SAP Revenue Cloud业务综述
  4. Vue中如何实现代码高亮功能?
  5. 使用Shell工具连接虚拟机
  6. 信号处理电路整理(RC、运放、TTL)
  7. windows7官方原版_如何下载微软原版操作系统、办公软件
  8. web和mysql连接并增删改查_Web界面实现数据库增删改查过程
  9. 非度量多维标度_用R语言做非度量多维尺度分析(NMDS)
  10. 计算机英语四六级考试时间,2019年12月英语四六级考试时间
  11. RMAN高级应用_pizi.pdf
  12. 2019年清华计算机系本校保研推免机考题目
  13. vue 引入萤石视频
  14. 爱奇艺动态化框架 Qigsaw 正式开源!
  15. python数据库分层设计_基于Python的高中教学数据库设计
  16. python画抛物线_python画抛物线
  17. 接着这次机会,发一下我做试管的经历~
  18. phpstorm+phpstudy调试thinkphp
  19. H、Magic necklace
  20. 超强下载神器,解决你的文档下载焦虑(下载百度文库)

热门文章

  1. 构建长期共赢生态圈,英特尔至强平台加速人工智能落地
  2. PyTorch 1.7发布:支持CUDA 11、Windows分布式训练
  3. 它来了!无人车穿梭在深圳的“宇宙最强街道”
  4. 今日可抢回程火车票,实测两款GitHub开源抢票插件,所有坑我们都帮你踩过了...
  5. 技术面试时该反问面试官什么问题?小伙整理了灵魂50问,GitHub日入2500星
  6. Mysql Proxy的安装配置详细教程
  7. asp.net mvc Post上传文件大小限制 (转载)
  8. 华为pat地址转换,以及内网web服务器发布
  9. sql instr()与LOCATE()字符串查找函数
  10. 综合使用union和limit区分结果并限制返回结果集的条数