作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
目前我有一个表示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.And
或 Expression.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/
我是一名优秀的程序员,十分优秀!