2017-04-09 68 views
2

結合目前我有一個表示MONSTOROUSLambdaExpression<Func<Project, bool>>形式我這樣做是爲了取代Linq循環的重複量的表達式樹。如何表達式樹的氮量與和/或運營商

這裏是冰山的一角。

 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); 
} 
... 

我怎樣才能將這些成一個單一的expression tree?

+0

這應該很簡單,只需使用'Expression.And'或'Expression.Or'調用來聚合單個表達式樹調用 –

回答

2

這應是簡單,只需使用Expression.AndExpression.Or調用在單個表達式樹調用聚集各種表情。讓我提供一個例子,如果你有一個List<Expression>,需要被aggreagated成單一表達式,然後使用使用And聚集例如下面的代碼,它可以是任何謂詞建設者:

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

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

這只是一個示例,默認情況下有很多表達式構建器可用,它們可以幫助將表達式綁定在一起,這可以基於相關邏輯,它可以是Or, AndAlso, OrAssign, OrElse

+0

中的各種表達式謝謝,這實際上比預期的更容易。 –

+0

歡迎,很高興幫助 –