【发布时间】:2021-10-14 17:17:32
【问题描述】:
我有一个由两个函数组成的条件列表:
public Func<TConfiguration, string> ConfigurationField { get;}
public Func<TNumbering, string> NumberingField { get; }
对于每个条件,表达式如下所示:
Expression<Func<TNumbering, TConfiguration, bool>> (n, c) => criteria.ConfigurationField(c) != criteria.NumberingField(n)
我需要用 OrElse 链接这些表达式的列表。
我尝试做类似的事情:
BinaryExpression expression = null;
foreach (var criteria in SelectionCriteria)
{
Expression<Func<TNumbering, TConfiguration, bool>> exp = (n, c) => criteria.ConfigurationField(c) != criteria.NumberingField(n);
expression = expression == null ? exp : Expression.OrElse(expression, exp);
}
if (expression == null) return Result.Failure("Expression not defined"));
var lambda = Expression.Lambda<Func<TConfiguration, bool>>(expression);
numberingsToRemove = numberings.Where(_ => configurations.All(lambda));
但是,编译器不喜欢它,说 Expression.Lambda
如果我使用
expression = expression == null ? Expression.OrElse(exp, exp) : Expression.OrElse(expression, exp);
我明白了
没有为 'System.Func
和 'System.Func 类型定义二元运算符 OrElse。
我是构建表达式的新手,有人可以指出正确的方向吗?
【问题讨论】:
-
也许用
Expression.MakeBinary(ExpressionType.OrElse, exp, exp)替换三元组中的exp? -
@Auditive - 我之前也尝试过类似的东西,我已经相应地更新了问题,但是我得到了错误:二进制运算符 OrElse 没有为 System.Func
. -
这能回答你的问题吗? How to append expressions in linq?
标签: c# expression expression-trees