<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12
      代碼改變世界

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

      2008-03-05 13:01  Jeffrey Zhao  閱讀(42335)  評論(69)    收藏  舉報

      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,我使用三個步驟完成這個擴展,大家可以關注代碼里的相關實現(如果需要的話我也可以在以后進行說明):

      1. 使用PartialEvaluator將表達式中的常量直接計算出來(例如“3 * 3”表達式將被替換為“9”),同時也會將一些存儲在變量中的值使用常量進行替換。
      2. 使用ConditionBuilder將表達式中的常量收集起來,并生成帶參數的Condition表達式(例如“[CreateTime] < {0} AND [UserName] <> {1}”)。
      3. 使用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 /* 更新條件 */);

      您可以點擊這里下載我對批量刪除的擴展。

      本文的英文版本

      主站蜘蛛池模板: 9lporm自拍视频区| 亚洲欧洲日产国无高清码图片| 亚洲熟妇精品一区二区| 高清中文字幕一区二区| 少妇上班人妻精品偷人| 久久精品国产福利一区二区| 午夜激情小视频一区二区| 激情国产一区二区三区四区小说 | 亚洲av区一区二区三区| 国产精品久久久久乳精品爆| 蜜臀91精品高清国产福利| 妇女性内射冈站hdwww000| 久久国产精品精品国产色| 黑人大荫道bbwbbb高潮潮喷| 国产线播放免费人成视频播放| 亚洲精品天堂在线观看| 久久婷婷丁香五月综合五| 成人午夜污一区二区三区| 日本三级香港三级人妇99| 人妻系列中文字幕精品| 国产精品激情| 国产成人精品亚洲资源| 亚洲日韩AV秘 无码一区二区| 黑色丝袜脚交视频麻豆| 国产精品美腿一区在线看| 国产成人欧美日韩在线电影| 国产网友愉拍精品视频手机| 免费人成再在线观看视频| 亚洲色成人网站www永久下载| 亚洲黄色一级片在线观看| 99re热这里只有精品视频 | 欧美大bbbb流白水| 无码中文av波多野结衣一区| 国产精品自在欧美一区| 午夜AAAAA级岛国福利在线| 大屁股肥熟女流白浆| 一区二区三区四区黄色片| 国产精成人品日日拍夜夜| 农村熟女大胆露脸自拍| 亚洲国产精品va在线观看麻豆| 欧美zoozzooz性欧美|