2017-04-09 69 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

欢迎,很高兴帮助 –