自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

LINQ to SQL刪除實現(xiàn)體會小結

開發(fā) 后端
LINQ to SQL刪除的實現(xiàn)我們會碰到使用Lambda Expression批量刪除數(shù)據的方法,那么這里就向你介紹在學習使用Lambda Expression批量刪除數(shù)據實現(xiàn)LINQ to SQL刪除過程中的一點體會。

在實現(xiàn)LINQ to SQL刪除時可以使用Lambda Expression批量刪除數(shù)據那么在解析表達式過程中生成Where Condition會有大量的代碼生成,那么這里向你做一點簡單的總結,算是一點體會吧,希望對你有所幫助。

根據LINQ to Sql原有的設計,解析Query得到DbCommand應該是SqlProvider干的事,只是現(xiàn)在這個SqlProvider只從IReaderProvider出(事實上MS也沒設計個IUpdateProvider或者IDeleteProvider來著),所以也只對SELECT感冒。搞的咱們只能在DataContext里自力更生了。

LINQ to SQL刪除實現(xiàn)的實例:

不過既然已經有了可以生成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刪除的實現(xiàn)過程中的一點體會就向你介紹到這里,希望對你了解和學習LINQ to SQL刪除有所幫助。

【編輯推薦】

  1. LINQ to SQL Table淺談
  2. LINQ to sql更新實體概述
  3. LINQ實體繼承簡單描述
  4. LINQ Library概述
  5. LINQ to SQL刪除實現(xiàn)淺析
責任編輯:仲衡 來源: 博客園
相關推薦

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刪除數(shù)據

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-15 14:52:15

linq級聯(lián)刪除

2009-09-14 15:45:28

LINQ刪除XML節(jié)點

2009-09-18 13:23:27

Northwind對象LINQ to SQL

2009-09-08 13:07:15

介紹Linq to S

2009-09-18 16:41:46

Linq to sql

2009-09-07 17:09:45

Linq To Sql

2009-09-10 10:37:15

LINQ to SQL

2009-09-11 09:41:19

LINQ to SQL

2009-09-16 09:38:27

LINQ To SQL

2009-09-09 18:03:47

LINQ to SQL
點贊
收藏

51CTO技術棧公眾號