天天躁日日躁狠狠躁AV麻豆-天天躁人人躁人人躁狂躁-天天澡夜夜澡人人澡-天天影视香色欲综合网-国产成人女人在线视频观看-国产成人女人视频在线观看

擴展LINQ to SQL:使用Lambda Expression批量刪除數(shù)據(jù)

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

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

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

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

當(dāng)然,擴展還支持更復(fù)雜的刪除條件,例如:

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),而這個擴展關(guān)鍵的就是二元表達式(BinaryExpression),除了這點就沒有太大問題了——當(dāng)然,這也是因為我放棄了對于復(fù)雜表達式樹的解析,例如現(xiàn)在就不支持“item.Introduction.Length < 10”這種條件,而對于更完整的解析方式來說,應(yīng)該將其轉(zhuǎn)化為T-SQL中的LEN函數(shù)。

這個擴展的關(guān)鍵在于根據(jù)表達式樹生成Where Condition,我使用三個步驟完成這個擴展,大家可以關(guān)注代碼里的相關(guān)實現(xiàn)(如果需要的話我也可以在以后進行說明):

  1. 使用PartialEvaluator將表達式中的常量直接計算出來(例如“3 * 3”表達式將被替換為“9”),同時也會將一些存儲在變量中的值使用常量進行替換。
  2. 使用ConditionBuilder將表達式中的常量收集起來,并生成帶參數(shù)的Condition表達式(例如“[CreateTime] < {0} AND [UserName] <> {1}”)。
  3. 使用DataContext.ExecuteCommand方法執(zhí)行完整的SQL語句。

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

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

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

it知識庫擴展LINQ to SQL:使用Lambda Expression批量刪除數(shù)據(jù),轉(zhuǎn)載需保留來源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請第一時間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 在线中文字幕网站 | 亚洲精品久久久久中文字幕二区 | 娇喘嗯嗯 轻点啊视频福利 娇喘高潮教室h | 日本电影免费久久精品 | 亚洲AV永久无码精品老司机蜜桃 | 亚洲成人日韩 | 性插图动态图无遮挡 | 9国产露脸精品国产麻豆 | 无限资源好看片2019免费观看 | 879影视动漫h免费观看 | 亚洲破处女| FREE另类老女人 | 强开乳罩摸双乳吃奶视频 | 富婆夜店找黑人猛男BD在线 | 肉肉的各种姿势高H细文 | 国产成人在线网站 | 午夜AV国产欧美亚洲高清在线 | 国产青青草原 | 菠萝视频高清版在线观看 | 国产精品久久久久影院色老大 | 亚洲2023无矿砖码砖区 | 我和黑帮老大第365天第2季在线 | 一个人的视频全免费在线观看www | BT7086福利二区最新 | 国产精品高清在线观看地址 | 亚洲电影二区 | 中文字幕无码亚洲字幕成A人蜜桃 | 国产二级一片内射视频播放 | 在线免费视频国产 | 久99re视频9在线观看 | 色综合久久天天影视网 | 美女坐脸vk| 亚洲精品成人无码A片在线 亚洲精品成人久久久影院 亚洲精品成人a在线观看 | 亚洲国产日韩欧美高清片a 亚洲国产日韩a精品乱码 | 久久综合久综合久久鬼色 | 成片免费观看视频大全 | 精品一卡2卡三卡4卡乱码精品视频 | 婷婷五月久久精品国产亚洲 | 手机看片一区二区 | 欧美丰满少妇久久无码精品 | 久久这里只精品热在线99 |