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



目前我有一个表达式树,它以Expression<Func<Project, bool>>的形式表示一个MONSTOROUSLambda我这样做是为了用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?

这应该很简单,只需使用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));

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

最新更新