LINQtoSQL删除实现体会小结

在实现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删除有所帮助。

文章题目:LINQtoSQL删除实现体会小结
转载源于:http://www.shufengxianlan.com/qtweb/news28/264578.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联