2009-06-03 72 views
1

我會在前言說我是第8天進入生活的C#開發人員。Linq動態參數爲IQueryable.Where()

對於我正在處理的項目中的許多DomainModel,我需要能夠根據用戶在審閱/搜索表單中提交的內容來過濾表中的所有記錄。

目前2%的短線遊是:

表單提交到FooController的/審查。

評分然後抓住從PARAMS [「過濾器」]所有鍵/值對的一個字典並傳遞到一個輔助類呼叫FooFinder.ByProperties看起來非常相似:

public IQueryable<WorkPlan> ByProperties(IDictionary<string, string> properties) 
    {    

     var result = ForSite(Convert.ToInt64(properties.DefaultVal("SiteId", "0"))); 

     v); 

     if(properties.ContainsKeyAndIsNotNullOrEmpty("WorkPlan.Key")) 
     { 
      var tempVal = Convert.ToInt64(properties["WorkPlan.Key"]); 
      result = result.Where(r => r.Id == tempVal); 
     } 
     // Multiple of these conditional checks follows 
     return result; 

}

我想盡可能地削減但卻難免重複的代碼,並試圖像

result = ByProperty(properties, "WorkPlan.key", typeof (Int64), r, v => r.id == v); 

但是那顯然不會爲很多原因工作...仍然是我想要完成的想法就在那裏。我真的想簡化代碼,並通過使用某種動態幫助程序/實用程序來加速過濾過程。

我嘗試過的其他想法是使用反射和作品進行直接比較的孩子,但接下來如何檢查像CreatedDaDatime屬性的東西,我希望所有記錄都大於「r => CreatedDatetime> CreatedFrom」。

如果這一切都沒有意義,請評論,我會盡力澄清任何問題。

回答

2

你在問什麼可以是自動化的,但它是相當多的工作,並且需要知道Expression API。這是一個相當先進的話題。

我可能會保持代碼「原樣」 ......幹是好的,但「不破工作代碼」是另一個格言值得知道...

或者,你可能想看看Dynamic LINQ Library - 這可能會幫助您實現自動化。但說實話,現有的代碼不是那麼難看......

+0

這就是我自己發現動態Linq庫時得出的結論。它非常酷,但我現在負擔不起。 – David 2009-06-03 21:25:48