C# Lambda Expression使用實例解析
我們在LINQ to SQL的實際開發應用中C# Lambda Expression的使用是什么情況呢?尤其是ORM框架使用時會碰到在刪除數據方面的一些問題,就是使用特定條件無法批量刪除數據。那么如何解決這種問題呢?那么這里向你提供了一點思路,希望對你有所幫助。
我們處理一些刪除操作,會選擇寫SQL語句或者執行存儲過程,例如:
- ItemDataContext db = new ItemDataContext();
- db.ExecuteCommand(
- "DELETE FROM Item WHERE [CreateTime] < {0}",
- DateTime.UtcNow.AddMonths(-1));
C# Lambda Expression的出現:
在程序里出現直接的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函數。
C# Lambda Expression的使用:
這個擴展的關鍵在于根據表達式樹生成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 /* 更新條件 */);
原文來自:http://www.cnblogs.com/zhanglxun/archive/2009/04/21/1440351.html
C# Lambda Expression的使用實例就向你介紹到這里,對于C# Lambda Expression的使用講解希望對你的開發有所幫助。
【編輯推薦】