2011-11-29 76 views
0

我在一個新項目中實現了service \ repository模式。我有一個基本的界面,看起來像這樣。一切工作很好,直到我需要使用GetMany方法。我只是不知道如何將LINQ表達式傳遞給GetMany方法。例如,我將如何簡單地對類型名稱的對象列表進行排序? (?)如何使用LINQ表達式?

nameRepository.GetMany

public interface IRepository<T> where T : class 
{ 
    void Add(T entity); 
    void Update(T entity); 
    void Delete(T entity); 
    void Delete(Expression<Func<T, bool>> where); 
    T GetById(long Id); 
    T GetById(string Id); 
    T Get(Expression<Func<T, bool>> where); 
    IEnumerable<T> GetAll(); 
    IEnumerable<T> GetMany(Expression<Func<T, bool>> where); 

} 



public virtual IEnumerable<T> GetMany(Expression<Func<T, bool>> where) 
{ 
    return dbset.Where(where).ToList(); 
} 

回答

2

假設你有的IRepository<MyClass>的實現,你會打個電話給GetMany像這樣:

IRepository<MyClass> repository = ...; 

IEnumerable<MyClass> filtered = repository.GetMany(
    mc => true); 

注意mc => truelambda expressionmc在這種情況下是參數(在這種情況下,MyClass類型的)傳遞至將待評估的Expression<Func<T, bool>>(一個將通過一個IQueryable<T>假設)和mc.SomeProperty == someValue是返回true的表達,這是的第二類型參數Expression<Func<T, bool>>

一旦你的filtered,您可以使用order by條款(或OrderBy extension method,它們是相同的)對結果進行排序,像這樣:

var filteredAndOrdered = filtered.OrderBy(mc => mc.MyProperty); 

注意GetMany返回IEnumerable<T>不是IQueryable<T>;如果結果集很大,這一點很重要,因爲排序將在客戶端上發生,而不會發送到服務器。

對於OrderBy操作,這可能會很昂貴,因爲它必須在返回第一個結果之前通過整個序列(進行排序)。

+0

感謝您的快速回復。提供的例子是一個條件,我只是在尋找一種方法來返回所有使用get many排序的對象。 – NullReference

+0

@NullReference:更新了問題,稍有誤解。 – casperOne

+0

謝謝,這是mc =>真正的部分,把我扔了。 – NullReference