2011-11-29 5 views
0

私は新しいプロジェクトにservice \ repositoryパターンを実装しています。私はこのような基本インターフェースを持っています。 GetManyメソッドを使用する必要があるまでは、すべてがうまく機能します。私はLINQ式をGetManyメソッドに渡す方法がわかりません。たとえば、名前のオブジェクトのリストを単純にソートするにはどうすればよいですか?LINQ where expressionの使い方は?

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 expressionに注意してください。この場合のmcは、評価されるExpression<Func<T, bool>>に渡されたパラメータ(この場合はMyClass)であり、mc.SomeProperty == someValuetrueの2番目の型パラメータである式である(IQueryable<T>と仮定します)。 Expression<Func<T, bool>>

あなたはfilteredを持っていたら、あなたはorder by句を使用することができ、結果をソートする(またはOrderBy extension methodを、彼らは同じです)、そのような:GetManyIEnumerable<T>を返すこと

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

注意、いいえIQueryable<T>;これは、結果セットが大きい場合は重要です。順序はクライアントで発生し、サーバーには送信されません。

OrderBy操作の場合、最初の結果を返す前にシーケンス全体を(順序付けする)必要があるため、これは高価になります。

+0

お返事ありがとうございます。提供されている例は条件付きであり、get getメソッドを使用してソートされたすべてのオブジェクトを返す方法を探しています。 – NullReference

+0

@NullReference:更新された質問です。少し誤読されました。 – casperOne

+0

ありがとう、それは私を投げていたmc =>真の部分でした。 – NullReference