千家信息网

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

发表于:2025-11-15 作者:千家信息网编辑
千家信息网最后更新 2025年11月15日,LINQ to SQL删除实现的示例分析,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。在实现LINQ to SQL删除时可以使用La
千家信息网最后更新 2025年11月15日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安全错误 数据库的锁怎样保障安全 sql打开已有的数据库 稳定的企业内网网络安全 和平路租房软件开发 小米手机总无法连接服务器 清空数据库表命令 天津学校卫星授时服务器虚拟主机 找出两个数组不同的数据库 api接口管理服务器 sql数据库列复制 软件开发信息管理的研究现状 知克莱网络技术有限公司 计算机网络技术员的周记 无线网络安全概念股 网络安全监督教育 广州青之天网络技术 小米数据库技术路线图 厦航软件开发待遇 明日之后白鹿原服务器 无线传感网络技术有哪些应用 学校服务器坏了怎么办 魔兽世界迅捷服务器怎么样 分享朋友圈赚钱软件开发 连接服务器时出现问题不能打电话 域控服务器正在准备网络连接 oracle数据库用的多么 科技成果:互联网 汽车车载网络技术的名词解释 网络安全与应用工程就业 广州网络技术最好的公司 有哪些网站是讲网络安全的
0