千家信息网

LINQ to SQL删除实现的示例分析

发表于:2025-02-01 作者:千家信息网编辑
千家信息网最后更新 2025年02月01日,LINQ to SQL删除实现的示例分析,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。在实现LINQ to SQL删除时可以使用La
千家信息网最后更新 2025年02月01日LINQ to SQL删除实现的示例分析

LINQ to SQL删除实现的示例分析,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

在实现LINQ to SQL删除时可以使用Lambda Expression批量删除数据那么在解析表达式过程中生成Where Condition会有大量的代码生成。

根据LINQ to Sql原有的设计,解析Query得到DbCommand应该是SqlProvider干的事,只是现在这个SqlProvider只从IReaderProvider出(事实上MS也没设计个IUpdateProvider或者IDeleteProvider来着),所以也只对SELECT感冒。搞的咱们只能在DataContext里自力更生了。

LINQ to SQL删除实现的实例:

不过既然已经有了可以生成SELECT的IReaderProvider,稍微把SELECT语句改造一下不就能得到DELETE了吗!基本思路:

public static int DeleteAll﹤TEntity﹥(  this Table﹤TEntity﹥ table,   Expression﹤Func﹤TEntity, bool﹥﹥ predicate)  where TEntity : class  {  IQueryable query = table.Where(predicate);  DbCommand com = dc.GetCommand(query);   //TODO:改造sql语句   return com.ExecuteNonQuery();   }  }

这里直接拿直接拿where生成的query来GetCommand,得到的sql语句大致如下:

SELECT fields... FROM tableName AS TableAlias WHERE Condition

LINQ to SQL删除的目标:

DELETE FROM tableName WHERE Condition

可见关键是得到tableName,用正则是***。不过这里还有一个缺陷就是只能用expression来做删除不能用linq query,比如我想这样:

var query = from item in context.Items  where item.Name.StartsWith("XX")  select item;  context.DeleteAll(query);

看来要把DeleteAll放到DataContext里,不过这样有风险,有可能会接受到无法转换的SELECT语句,增加判断必不可少。

LINQ to SQL删除最终完成如下:

public static class DataContextEx  {  public static int DeleteAll(  this DataContext dc, IQueryable query)  {  DbCommand com = dc.GetCommand(query);   Regex reg = new Regex("^SELECT[\\s]*(?﹤Fields﹥.*)  [\\s]*FROM[\\s]*(?﹤Table﹥.*)[\\s]*AS[\\s]*  (?﹤TableAlias﹥.*)[\\s]*WHERE[\\s]*(?﹤Condition﹥.*)",  RegexOptions.IgnoreCase);   Match match = reg.Match(com.CommandText);   if (!match.Success)  throw new ArgumentException(  "Cannot delete this type of collection");   string table = match.Groups["Table"].Value.Trim();  string tableAlias = match.Groups["TableAlias"].Value.Trim();  string condition = match.Groups["Condition"].  Value.Trim().Replace(tableAlias, table);   com.CommandText = string.Format(  "DELETE FROM {0} WHERE {1}", table, condition);   if (com.Connection.State != System.Data.ConnectionState.Open)  com.Connection.Open();   return com.ExecuteNonQuery();  }    public static int DeleteAll﹤TEntity﹥(  this Table﹤TEntity﹥ table, Expression﹤Func﹤TEntity, bool﹥﹥ predicate)  where TEntity : class {  IQueryable query = table.Where(predicate);   return table.Context.DeleteAll(query);  }  }

注:reg表达式取自MSDN Forum

关于LINQ to SQL删除实现的示例分析问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注行业资讯频道了解更多相关知识。

语句 分析 问题 生成 示例 更多 表达式 帮助 改造 解答 设计 易行 自力更生 简单易行 事实 事实上 代码 代码生成 关键 内容 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 韶关网络安全特训营费用多少 dz安装填写数据库怎么写 建筑和软件开发哪个学校好 数据库清除密码吗 fr24服务器无法使用 江苏中小学生网络安全知识竞赛 单位网络安全解决方案 艾尔登之环连不上服务器 购买软件开发服务费怎么入账 鸣汇广盛互联网科技 doc服务器 幻塔oppo渠道服服务器 软件开发助理和协助要代码 c 根据时间查询数据库 如何保证数据库的数据安全 浏览器远程服务器怎么下载 通过服务器控制机顶盒 北京气象影视节目制作软件开发 方舟进服务器贴图模糊 it服务器自动化 杨浦区常规网络技术服务诚信为本 中国知网期刊数据库有考研资源吗 淘宝优惠券自动转发软件开发 网络安全是经济发展的什么 扫一扫的软件开发 数据库查询数据使用索引 武汉国家网络安全学院在那 哪种软件开发技术未来有发展 游戏软件开发 Unicode 数据库迁移 技术实现
0