2010-05-18 112 views
4

我試圖模仿我的ADO.NET DAL方法的LINQ Where擴展方法。Lambda表達式和存儲過程

Bascially,我的目標是有一個我可以打電話的方法。如:

Product p = Dal.GetProduct(x => x.ProductId == 32); 
Product p2 = Dal.GetProduct(x => x.ProductName.Contains("Soap")); 

然後我想仔細分析這些謂詞和發送過濾器選項參數在ADO.NET存儲過程調用。

任何意見非常感謝。

+3

這是一個龐大的任務進行。你有沒有考慮使用Linq2Sql或Linq2NHibernate(即使用現成的DAL/ORM)? – 2010-05-18 18:20:51

回答

9

正如@丹尼爾指出的,這遠非簡單。解決方案大綱是讓GetProduct採用Expression<Func<Product, bool>>類型的參數。然後您必須遍歷此表達式的分析樹,爲已知函數生成正確的SQL,並決定如何處理未知函數。基本上有兩種選擇:

  1. 拋出一個錯誤(as linq-to-sql does)。
  2. 在翻譯中跳過它,然後將其應用於返回的結果。如果大量數據只是被過濾掉,這對性能的影響當然會很大。

這將是一個有趣的練習,以做到這一點 - 但我幾乎看不到的方式在現實世界來證明它,當已經有LINQ2SQL,linq2entities和linq2NHibernate,沒有工作。