如何将N个表达式树与OR / And运算符组合在一起

时间:2017-04-09 18:38:06

标签: c# linq lambda delegates iqueryable

目前我有一个表达式树,它以[{1}}的形式表示 MONSTOROUS Lambda我这样做是为了用Expression<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 分为6个类别,并希望根据条件语句将它们组合在一起。 基本示例

expression trees

如何将这些组合成一个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 个答案:

答案 0 :(得分:2)

这应该很简单,只需使用Expression.AndExpression.Or调用来聚合单个表达式树调用中的各种表达式。让我举一个例子,如果你有一个List<Expression>,需要聚合成单个表达式然后使用And聚合使用下面的代码,例如,它可以是任何谓词构建器:

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

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

这只是一个示例,默认情况下有很多Expression构建器可用,它可以帮助根据相关逻辑将表达式绑定在一起,它可以是Or, AndAlso, OrAssign, OrElse