2010-02-03 26 views
2

我正在考慮重構存儲庫我必須提高其靈活性並減少方法數量。存儲庫以linq表達式進行過濾

凡有以下幾種方法:

Collection GetAllUsersByRole(Role role) 
User GetUserByuserName(string userName) 

...我想有一個單一的方法服用LINQ表達式:

ICollection GetUsers(Expression e) 
{ 
    //retrieve user collection from store 
    //apply expression to collection and return 
} 

這是一個合理的做法?據推測,我會失去一些效率,因爲每次都需要檢索和過濾完整用戶集合,而不是根據某些硬編碼標準檢索一部分用戶。

編輯:NHibernate在我的實現中提供了ORM。

回答

3

你真的想要一個表達式作爲該方法的參數。

就表現而言,這真的歸結爲你想要走多遠。最簡單的方法是將所有對象放入內存中,然後使用謂詞表達式進行過濾。

另一方面,你提到某種標準。我不知道您的後端數據系統是什麼,但您可以將這些通過的過濾器轉換爲您的標準。這基本上是Linq to SQL和Linq to Entities所做的,但希望您需要支持的可能性範圍要小得多。如果不是的話,如果你想採用這種方法,那麼切換到其中一種ORM工具可能是有意義的。

+0

「最簡單的方法是將所有對象帶入內存,然後使用謂詞表達式進行過濾。」這是一個很好的觀點,這個類可以是一個翻譯到另一個邏輯,但使暴露方法的數量更小。 – 2010-02-03 14:25:32

1

這不是一個非常合理的方法,通常情況下會花費你很多性能問題。如果您使用接受LINQ查詢的數據訪問技術,則只能使用此查詢(表達式)。對於LINQ to SQL,這可以是IQueryable或對於EntityFramework的ObjectQuery。對於nHibernate,它也可以是ICriteria(沒有linq支持)。所有現代的ORM工具都有自己的表達式API,所以你只需要使用它。如果你有自定義的數據訪問層,你將需要編寫你自己的API來創建標準,例如Query Object

+0

我們使用NHibernate,所以我應該提供一個ICriteria對象而不是表達式?如果是這樣,我會失望的不能使用lambda表達式。 – Ben 2010-02-03 14:36:19

+1

@Ben Aston,NHibernate開始創建一個全功能的Linq提供程序(http://sourceforge.net/projects/nhibernate/files/),但我不知道目前的支持級別是多少。正如我在迴應中提到的那樣,可以將過濾器表達式轉換爲Hibernate Criteria,但是您可能希望限制可以以此方式運行的查詢類型(例如,將屬性簡單地等同於常量可能很容易)。 – 2010-02-03 15:09:32