2016-10-02 20 views
0

私はLinq式を初めて使用しています。Linq式ツリーとフィルタリングロジック

私は、次のオーバーロードされたメソッドを公開している、APIを呼び出しています:

CustomPaging<TEntity> GetAll(int index, int maxPage, Expression<Func<TEntity, int>> keySelector, OrderBy orderBy = OrderBy.Ascending); 

CustomPaging<TEntity> GetAll(int index, int maxPage, Expression<Func<TEntity, int>> keySelector, Expression<Func<TEntity, bool>> predicate, OrderBy orderBy, params Expression<Func<TEntity, object>>[] useProperties) 

私の意図は、渡された値でフィルタリングするために、述語の一部として「ID」パラメータを渡すことです。

の線に沿って何か:

x => x.UserId.Equals(id) 

私の質問は - それは、このフィルタリングを実現する方法、APIのメソッドシグネチャから、決定することが可能でしょうか?

私は無駄に以下のバリエーションを渡すと周り果たしている:私は明らかに非常によく、式ツリーを理解していない

Expression<Func<Group, int>> myFunc = u => u.UserId == id 

Error: Cannot convert bool to int.

Func<Group, int> myFunc = g => g.UserId == id; 

Error: Cannot convert from System.Func to System.Linq.Expressions.Expression

といくつかの友好を使用することができますガイダンス。あらゆる洞察に感謝します。

+0

Joseph AlbahariのPredicate Builderを見てください。 http://www.albahari.com/nutshell/predicatebuilder.aspx –

+0

'u.UserId == id'はブール値を返し、' Expression > 'は' int'戻り値の型を予期します。 'keySelector'はフィルタリングを担当するパラメータではなく、' predicate'という次のパラメータです。 – user3185569

答えて

0

パラメータタイプExpression<Func<TEntity, bool>>perdicateは、フィルタリングの責任パラメータです:

Expression<Func<Group, bool>> myFunc = u => u.UserId == id; 

あなたは、最終的な呼び出しが可能<Group, bool>ない<Group, int>

の署名と一致する必要があります。

var results = GetAll(someIndex, someMaxPage, x=> x.UserId, u => u.UserId == id); 

または:

Expression<Func<Group, int>> myKeySelector = u => u.UserId; 
Expression<Func<Group, bool>> myFilter = u => u.UserId == id; 
var results = GetAll(someIndex, someMaxPage, myKeySelector, myFunc); 
+0

'Expression >' not 'Expression >' –

+0

@LucasTrzesniewski正しい。更新しました。 – user3185569

+0

割り当てオペレータがOPで使用されているように見えません。忍者編集、多分? –