程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> 擴展LINQ to SQL - 使用Lambda Expression批量刪除數據

擴展LINQ to SQL - 使用Lambda Expression批量刪除數據

編輯:關於.NET

ORM框架在刪除數據方面一直有個尴尬,那就是無法通過指定條件批量刪除數 據(當然這本不是ORM的問題,只是使用上感覺不方便)。於是對於一些刪除操 作,我們不得不寫SQL語句或者執行存儲過程,例如:

ItemDataContext db = new ItemDataContext();
db.ExecuteCommand(
  "DELETE FROM Item WHERE [CreateTime] < {0}",
  DateTime.UtcNow.AddMonths(-1));

我始終認為,在程序裡出現直接的SQL語句是一件很丑陋的事情。在我看來, 數據庫操作應該被封裝起來,而對於應用層的開發人員來說,眼中應該只有對象 ——退一步的話也可向數據庫發送指令(就是使用存儲過程)。當然 ,這是理想狀態,值得追求,但不可強求。幸運的是C# 3.0所擁有的強大特性足 以讓我們對LINQ to SQL的功能進行擴展。為了更好地進行項目開發,以及周五 的一次技術交流,我為LINQ to SQL擴展了批量刪除功能。當項目中引用了這個 擴展之後,我們就可以使用如下的代碼來實現上面的功能了:

ItemDataContext db = new ItemDataContext();
db.Items.Delete(item => item.CreateTime < DateTime.UtcNow.AddMonths(-1));

當然,擴展還支持更復雜的刪除條件,例如:

ItemDataContext db = new ItemDataContext();
db.Items.Delete(item =>
  item.CreateTime < DateTime.UtcNow.AddMonths(-1) ||
  item.ViewCount < item.CommentCount && item.UserName != "jeffz");

之前我對於LINQ to SQL的擴展大都基於DataContext,不過很明顯,這次的 擴展是基於Table<T>的。總的來說,這個擴展比我想象中要簡單不少。針 對LINQ的擴展最麻煩的地方就在於解析表達式樹(Expression Tree),而這個 擴展關鍵的就是二元表達式(BinaryExpression),除了這點就沒有太大問題了 ——當然,這也是因為我放棄了對於復雜表達式樹的解析,例如現在 就不支持“item.Introduction.Length < 10”這種條件,而對於 更完整的解析方式來說,應該將其轉化為T-SQL中的LEN函數。

這個擴展的關鍵在於根據表達式樹生成Where Condition,我使用三個步驟完 成這個擴展,大家可以關注代碼裡的相關實現(如果需要的話我也可以在以後進 行說明):

使用PartialEvaluator將表達式中的常量直接計算出來(例如“3 * 3”表達式將被替換為“9”),同時也會將一些存儲在變量中 的值使用常量進行替換。

使用ConditionBuilder將表達式中的常量收集起來,並生成帶參數的 Condition表達式(例如“[CreateTime] < {0} AND [UserName] <> {1}”)。

使用DataContext.ExecuteCommand方法執行完整的SQL語句。

有了批量刪除的功能,那麼還缺點什麼呢?那自然就是批量更新的功能了。 批量更新的功能比刪除略為復雜一些,我正在開發之中。在有了這個擴展之後, 我們就可以使用如下的方法進行批量更新了:

ItemDataContext db = new ItemDataContext();
db.Items.Update(
  item => new Item
  {
    Introduction = item.Title + "Hello World",
    ViewCount = item.ViewCount + 1,
  },//更新方式
  item => item.CommentCount > 100/*更新條件*/);

您可以下載我對批量刪除的擴展。

本文配套源碼

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved