LINQ to SQL删除实现体会小结

开发 后端
LINQ to SQL删除的实现我们会碰到使用Lambda Expression批量删除数据的方法,那么这里就向你介绍在学习使用Lambda Expression批量删除数据实现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了吗!基本思路:

  1. public static int DeleteAll﹤TEntity﹥(  
  2. this Table﹤TEntity﹥ table,   
  3. Expression﹤Func﹤TEntity, bool﹥﹥ predicate)  
  4. where TEntity : class  
  5. {  
  6. IQueryable query = table.Where(predicate);  
  7. DbCommand com = dc.GetCommand(query);  
  8.  
  9. //TODO:改造sql语句  
  10.  
  11. return com.ExecuteNonQuery();  
  12.  }  
  13. }  

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

  1. SELECT fields... FROM tableName AS TableAlias WHERE Condition 

LINQ to SQL删除的目标:

  1. DELETE FROM tableName WHERE Condition 

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

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

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

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

  1. public static class DataContextEx  
  2. {  
  3. public static int DeleteAll(  
  4. this DataContext dc, IQueryable query)  
  5. {  
  6. DbCommand com = dc.GetCommand(query);  
  7.  
  8. Regex reg = new Regex("^SELECT[\\s]*(?﹤Fields﹥.*)  
  9. [\\s]*FROM[\\s]*(?﹤Table﹥.*)[\\s]*AS[\\s]*  
  10. (?﹤TableAlias﹥.*)[\\s]*WHERE[\\s]*(?﹤Condition﹥.*)",  
  11. RegexOptions.IgnoreCase);  
  12.  
  13. Match match = reg.Match(com.CommandText);  
  14.  
  15. if (!match.Success)  
  16. throw new ArgumentException(  
  17. "Cannot delete this type of collection");  
  18.  
  19. string table = match.Groups["Table"].Value.Trim();  
  20. string tableAlias = match.Groups["TableAlias"].Value.Trim();  
  21. string condition = match.Groups["Condition"].  
  22. Value.Trim().Replace(tableAlias, table);  
  23.  
  24. com.CommandText = string.Format(  
  25. "DELETE FROM {0} WHERE {1}", table, condition);  
  26.  
  27. if (com.Connection.State != System.Data.ConnectionState.Open)  
  28. com.Connection.Open();  
  29.  
  30. return com.ExecuteNonQuery();  
  31. }  
  32.  
  33.  
  34. public static int DeleteAll﹤TEntity﹥(  
  35. this Table﹤TEntity﹥ table, Expression﹤Func﹤TEntity, bool﹥﹥ predicate)  
  36. where TEntity : class 
  37. {  
  38. IQueryable query = table.Where(predicate);  
  39.  
  40. return table.Context.DeleteAll(query);  
  41. }  
  42. }  

注:reg表达式取自MSDN Forum

原文来自博客园:http://www.cnblogs.com/jackielin/archive/2008/03/07/1095602.html

LINQ to SQL删除的实现过程中的一点体会就向你介绍到这里,希望对你了解和学习LINQ to SQL删除有所帮助。

【编辑推荐】

  1. LINQ to SQL Table浅谈
  2. LINQ to sql更新实体概述
  3. LINQ实体继承简单描述
  4. LINQ Library概述
  5. LINQ to SQL删除实现浅析
责任编辑:仲衡 来源: 博客园
相关推荐

2009-09-14 09:46:00

LINQ to SQL

2009-09-14 13:17:51

LINQ to SQLLINQ to SQL

2010-09-01 15:30:24

SQL删除

2009-09-14 10:29:02

LINQ删除记录

2010-08-04 09:55:34

LINQ to SQL

2009-09-14 10:45:33

LINQ删除数据

2009-04-02 10:37:52

通用基类SQLLINQ

2009-09-08 14:45:24

Linq to SQL支持SQL Serve

2009-09-14 16:00:51

LINQ基本操作LINQ

2009-09-14 16:12:57

LINQ删除记录

2009-09-14 15:45:28

LINQ删除XML节点

2009-09-15 14:52:15

linq级联删除

2009-09-14 19:20:22

LINQ TO SQL

2009-09-18 16:41:46

Linq to sql

2009-09-10 10:37:15

LINQ to SQL

2009-09-16 17:11:35

LINQ To SQL

2009-09-09 18:03:47

LINQ to SQL

2009-09-11 09:41:19

LINQ to SQL

2009-09-18 13:23:27

Northwind对象LINQ to SQL

2009-09-16 09:38:27

LINQ To SQL
点赞
收藏

51CTO技术栈公众号