gpt4 book ai didi

c# - 如何将 N 个表达式树与 OR/And 运算符组合起来

转载 作者:行者123 更新时间:2023-11-30 23:14:07 26 4
gpt4 key购买 nike

目前我有一个表示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

我已经将这些分组 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));

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

关于c# - 如何将 N 个表达式树与 OR/And 运算符组合起来,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43310464/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com