成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

詳解LINQ to SQL簡單的單表批量刪除

開發 后端
本文將介紹的是LINQ to SQL簡單的單表批量刪除,包括操作表達式樹操作二元表達式等方面的內容。

今天在網上看到老趙前輩的擴展LINQ to SQL:使用Lambda Expression批量刪除數據,我看完了文章,還沒有看源代碼,我一般都習慣于在看別人的代碼前,思考一下如果我來實現我會如何實現。我想了許久操作表達式樹操作二元表達式(BinaryExpression)我是肯定困難的,對于表達式類庫的了解不多,用了Reflector反射,結果什么都看不見,也許我的Reflector版本低了,沒有更新。我就放棄了這種實現方式,我想有沒有其他的方式呢?最終我覺得可以操作生成sql執行同樣可以達到目的,也許更簡單化。

如何獲取SQL呢,LINQ中有db.GetCommand(IQueryable )方法,DBCommand的CommandText就是SQL了,那我們如何獲取IQueryable 呢,我的***感覺就是where方法。所以就有下面的語句了,IQueryable q = source.Where(query).AsQueryable();     DbCommand cmd = db.GetCommand(q);

現在我們等到了查詢SQL,如何轉化為Delete呢,我用了正則表達式匹配。就得到了下面完全代碼:

  1. public static class TableExtension  
  2.     {  
  3.         /// <summary>  
  4.         /// 單表操作批量刪除  
  5.         /// </summary>  
  6.         /// <typeparam name="T"></typeparam>  
  7.         /// <param name="source"></param>  
  8.         /// <param name="query"></param>  
  9.         /// <returns></returns>  
  10. public static int Delete<T>(this System.Data.Linq.Table<T> source, Expression<Func<T, bool>> query)  
  11.             where T : class 
  12.         {  
  13.             if (source == null)  
  14.                 throw new ArgumentException("source");  
  15.             if (query == null)  
  16.                 throw new ArgumentException("query");  
  17.             //query = t => true;  
  18.             //為空DELETE  FROM [dbo].[test] 全刪除;個人覺得為空全刪除,很不人道,所以還是拋異常  
  19.             System.Data.Linq.DataContext db = source.Context;  
  20.             IQueryable q = source.Where(query).AsQueryable();  
  21.             DbCommand cmd = db.GetCommand(q);  
  22.             string sql = cmd.CommandText;  
  23.             string regex =  
  24.  @"from\s*\[\s*dbo\s*\]\s*\.\s*\[\s*\w+\s*\]\s*(?<tableparam>(as\s*(?<tablepname>(\[\s*\w+\s*\]))))(\.|(\r)|(\n))*";  
  25. MatchCollection matches = Regex.Matches(sql, regex, RegexOptions.Multiline | RegexOptions.IgnoreCase);  
  26.             Debug.Assert(matches != null"regex match :null");  
  27.             Debug.Assert(matches.Count == 1, "regex match length :" + matches.Count);  
  28.             if (matches != null && matches.Count > 0)  
  29.             {  
  30.                 Match match = matches[0];  
  31.  sql = ("DELETE  " + match.Value.Replace(match.Groups["tableparam"].Value, "") +  
  32.     sql.Substring(match.Index + match.Length)).Replace(match.Groups["tablepname"].Value + "."" ");  
  33.    List<object> dbparams = new List<object>();  
  34. foreach (SqlParameter item in cmd.Parameters)  
  35.                 {  
  36.    SqlParameter p = new SqlParameter(item.ParameterName, item.SqlDbType, item.Size);  
  37.                     p.Value = item.Value;  
  38.                     dbparams.Add(item.Value);  
  39.                 }  
  40.                 q = null;  
  41.                 cmd = null;  
  42.                 matches = null;  
  43.     Debug.WriteLine("delete sql :" + sql);  
  44.    return db.ExecuteCommand(sql, dbparams.ToArray());  
  45.  
  46.  
  47.             }  
  48.             return 0;  
  49.         } 

現在我們可以進行批量刪除了,如:

  1. DataContext.test.Delete(t => t.id > 0 && t.name.Contains("test"
  2. || new string[] { "12""34""45" }.Contains(t.name)   
  3. &&  t.name.Length >1); 

是不是很簡單:看看Debug輸出的SQL:

image

在看一個:

  1. DataContext.Orders.Delete(t => !t.EmployeeID1.HasValue); 

image

這個擴展中的缺點:

1:只針對對單表操作,不支持linq的連接,如:DataContext.test.Delete(t => t.Orders.OrderID > 0);我這個我認為這個可以通過一個更復雜正則表達式完成。還有一種思路更簡潔,就是通過sql server支持的表變量或者是臨時表先查詢出結果,在根據主鍵實現刪除。也許你會說可以寫成存儲過程,我個人不喜歡它,我一般盡量在程序中TSQL,移植性好,除非性能考慮采用存儲過程。

2:事務處理:在這里只是一個先前的測試Demo,所以么有考慮。我覺得我們可以建立一個類來管理sql語句或者查詢條件表達式在調用save方法時候進行內部事務操作(我一般不喜歡將事務顯示在外部,因為我覺得事務很費資源,等待時間過長數據庫容易崩潰,或者對表的鎖定等,不知道這個想法對不對,請大家給個建議)。現在可以在外部事務操作就是有點像ADO.NET了,呵呵麻煩。

優點:

1:可以支持復雜的表達式,想老趙提到的“item.Introduction.Length < 10“,以及后面評論中提到的in、like等。

2:實現簡單,操作簡單,這是最重要的,代碼很容易理解。

3:執行不需要從數據庫里取出實體在執行,這是Linq的做法。更符合我們的習慣。我看見在老趙博客***一個評論說它用EF也實現了批量刪除,它的那種方式是取出實體在delete,其實并不是EF特有的,Linq也完全可以實現,就幾行代碼而已。

還想多寫一些優點,暫時就想到這些,有什么Bug或者建議請大家一定要指出。還有就是不知道這樣對內存有么有影響,還沒有來得及測試。我個人覺得其實計算機的東西都是我們生活中簡單的問題運用,就在個人的思維了,就和前面講的老外Linq組合查詢的PredicateExtensions類一樣。恩現在趕緊去看看老趙前輩的實現方式了,還沒來得及看過一行代碼呢,不知對事務、多表的支持如何。

[[13908]]

原文標題:Linq To Sql 簡單的單表批量刪除

鏈接:http://www.cnblogs.com/whitewolf/archive/2010/08/04/1791682.html

【編輯推薦】

  1. Linq匿名類型簡單概述
  2. Linq隨機讀取數據淺析
  3. Linq Lambda表達式全面分析
  4. Linq擴展方法簡單分析
  5. 初探Linq局部變量類型

 

責任編輯:彭凡 來源: 博客園
相關推薦

2009-09-14 13:17:51

LINQ to SQLLINQ to SQL

2010-09-02 10:53:21

SQL刪除

2009-09-08 13:16:01

Linq to SQL

2009-09-11 09:41:19

LINQ to SQL

2009-09-18 14:51:19

LINQ TO SQL

2009-09-15 13:53:53

Linq To Sql

2009-09-15 13:37:24

Linq To Sql

2009-09-14 09:46:00

LINQ to SQL

2010-09-03 11:52:41

SQL刪除

2009-09-17 15:51:39

Linq to sql

2009-09-14 10:12:11

LINQ to SQL

2010-09-01 15:30:24

SQL刪除

2009-09-09 11:24:13

Linq使用數據表

2010-09-03 11:47:38

SQL刪除

2010-07-09 15:31:25

SQL Server

2009-09-07 16:13:14

LINQ to SQL

2010-09-01 16:26:11

SQL刪除批量

2009-09-15 15:45:00

Linq聯合查詢

2009-04-20 15:54:04

SQL Server重復行

2009-09-14 19:20:22

LINQ TO SQL
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: h视频免费看 | 激情国产 | 国产一区二区免费 | 水蜜桃亚洲一二三四在线 | 日韩欧美国产一区二区三区 | 久久亚洲欧美日韩精品专区 | 久久精品亚洲成在人线av网址 | 国产91一区二区三区 | 精品国产青草久久久久福利 | 伊人久久国产 | 国产乱码精品1区2区3区 | 毛片免费视频 | 免费观看一级黄色录像 | 亚洲综合无码一区二区 | 日韩二区| 免费观看日韩av | 激情网站在线 | 国产日韩欧美二区 | 国产成人综合在线 | 99re99| 日韩毛片免费视频 | 国产精品永久免费视频 | 91五月天 | 黄色毛片大全 | 欧美一级三级 | 亚洲精品在线免费 | 精品一区二区三区在线观看 | 欧美日韩在线电影 | 91精品国产综合久久婷婷香蕉 | 国产精品久久九九 | 欧美日韩一二三区 | 成人欧美一区二区 | 日韩资源| 日日操天天射 | 国产在线观看不卡一区二区三区 | 精品影视| 91精品国产91久久久久久吃药 | 一区二区三区在线 | 国产精品一区二区三区久久 | 亚洲欧美在线观看视频 | 日韩精品免费看 |