文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

LINQ to SQL简单的单表批量删除怎么实现

2023-06-17 14:44

关注

这篇文章主要讲解了“LINQ to SQL简单的单表批量删除怎么实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“LINQ to SQL简单的单表批量删除怎么实现”吧!

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

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

public static class TableExtension      {          /// <summary>          /// 单表操作批量删除          /// </summary>          /// <typeparam name="T"></typeparam>          /// <param name="source"></param>          /// <param name="query"></param>          /// <returns></returns>  public static int Delete<T>(this System.Data.Linq.Table<T> source, Expression<Func<T, bool>> query)              where T : class         {              if (source == null)                  throw new ArgumentException("source");              if (query == null)                  throw new ArgumentException("query");              //query = t => true;              //为空DELETE  FROM [dbo].[test] 全删除;个人觉得为空全删除,很不人道,所以还是抛异常              System.Data.Linq.DataContext db = source.Context;              IQueryable q = source.Where(query).AsQueryable();              DbCommand cmd = db.GetCommand(q);              string sql = cmd.CommandText;              string regex =   @"from\s*\[\s*dbo\s*\]\s*\.\s*\[\s*\w+\s*\]\s*(?<tableparam>(as\s*(?<tablepname>(\[\s*\w+\s*\]))))(\.|(\r)|(\n))*";  MatchCollection matches = Regex.Matches(sql, regex, RegexOptions.Multiline | RegexOptions.IgnoreCase);              Debug.Assert(matches != null, "regex match :null");              Debug.Assert(matches.Count == 1, "regex match length :" + matches.Count);              if (matches != null && matches.Count > 0)              {                  Match match = matches[0];   sql = ("DELETE  " + match.Value.Replace(match.Groups["tableparam"].Value, "") +      sql.Substring(match.Index + match.Length)).Replace(match.Groups["tablepname"].Value + ".", " ");     List<object> dbparams = new List<object>();  foreach (SqlParameter item in cmd.Parameters)                  {     SqlParameter p = new SqlParameter(item.ParameterName, item.SqlDbType, item.Size);                      p.Value = item.Value;                      dbparams.Add(item.Value);                  }                  q = null;                  cmd = null;                  matches = null;      Debug.WriteLine("delete sql :" + sql);     return db.ExecuteCommand(sql, dbparams.ToArray());                }              return 0;          }

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

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:

LINQ to SQL简单的单表批量删除怎么实现

在看一个:

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

LINQ to SQL简单的单表批量删除怎么实现

这个扩展中的缺点:

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

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

优点:

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

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

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

还想多写一些优点,暂时就想到这些,有什么Bug或者建议请大家一定要指出。还有就是不知道这样对内存有么有影响,还没有来得及测试。我个人觉得其实计算机的东西都是我们生活中简单的问题运用,就在个人的思维了,就和前面讲的老外Linq组合查询的PredicateExtensions类一样。恩现在赶紧去看看老赵前辈的实现方式了,还没来得及看过一行代码呢,不知对事务、多表的支持如何。

感谢各位的阅读,以上就是“LINQ to SQL简单的单表批量删除怎么实现”的内容了,经过本文的学习后,相信大家对LINQ to SQL简单的单表批量删除怎么实现这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯