2017-04-09 18 views
2

現在、私は私がLinqとループの繰り返しの量を置き換えるためにこれをしたExpression<Func<Project, bool>>の形でMONSTOROUSLambdaを表す式ツリーを持っています。どのようにして式ツリーのN量を組み合わせることおよび/またはオペレーター

ここはアイスバーグの先端です。

 return prj => !FilterCriteria.IsFilterEnabled && prj.OrganizationID != null 
         || (((FilterCriteria.OrganiazaitonId == null) || organizationIDs.Contains(prj.OrganizationID.Value)) 
         || ((FilterCriteria.ActivityTypeId == null) || (act.ActivityTypeID == FilterCriteria.ActivityTypeId)) 
          && ((FilterCriteria.ProductLineId == null) || (prj.ProductLineID == FilterCriteria.ProductLineId)) 
          && ((FilterCriteria.ProjectTypeId == null) || (prj.ProjectTypeID == FilterCriteria.ProjectTypeId)) 
          && ((FilterCriteria.ProjectId == null) || (prj.ProjectID == FilterCriteria.ProjectId)) 
          && ((FilterCriteria.StartDateFrom == null) || (prj.StartDate >= FilterCriteria.StartDateFrom)) 
//... this goes on for about 40 more lines 

私は、これらのexpression trees 6にカテゴリをグループ化し、条件文に基づいて、それらを組み合わせたいてきました。 基本的な例

if(...){ 
     Expression<Func<Project, bool>> filterEnabled = prj => !FilterCriteria.IsFilterEnabled && prj.OrganizationID != null; 
} 
else if(...){  //combined with `OR` statement 

     Expression<Func<Project, bool>> organizations = prj => organizationIDs.Contains(prj.OrganizationID.Value); 
} 
else if (...){  //combined with `AND` statement 

     var projectType = prj => (prj.ProjectTypeID == FilterCriteria.ProjectTypeId); 
} 
... 

はどうすればこれらは1つだけの式ツリーの呼び出しで様々な表情を集約するExpression.AndまたはExpression.Or呼び出しを使用し、単一expression tree?

+0

これは単純で、単にExpression.AndまたはExpression.Orを使用します。単一の式ツリーでさまざまな式を集約するための呼び出し –

答えて

2

これは、単純なものでなければならないに組み合わせることができます。あなたはたとえばAnd集約を使用して、次のコードを使用し、その後単一の式にaggreagatedする必要がList<Expression>を、持っている場合、それは述語ビルダーのいずれかとすることができる、私は例を提供してみましょう:

List<Expression> exptree = new List<Expression>(); 

    var resultEXpression = exptree.Skip(1).Aggregate(exptree.FirstOrDefault(), 
    (exp1,exp2) => Expression.And(exp1,exp2)); 

これはただでありますサンプルには、デフォルトで利用可能なExpression Builderが多数あり、関連するロジックに基づいて式をまとめてバインドすることができます。Or, AndAlso, OrAssign, OrElse

+0

ありがとうございました、実際は予想よりも簡単です。 –

+0

ようこそ、うれしい –

関連する問題