【问题标题】:Dynamic lambda wrapped with try catch用 try catch 包裹的动态 lambda
【发布时间】:2015-06-18 17:02:54
【问题描述】:

我想通过用户定义的 Where 调用过滤IEnumerable<ModuleItem>(因此表达式由字符串对象给出)

到目前为止,我可以使用此代码使用 DynamicLinq 创建过滤器

Expression<Func<ModuleItem, bool>> expr = System.Linq.Dynamic.DynamicExpression.ParseLambda<ModuleItem, bool>(value, null);

问题在于,如果对集合中的某个项目的评估失败,则整体过滤将失败。所以我想在 lambda 中捕获异常并返回 false 来过滤掉失败的项目。

我尝试用TryExpression.TryCatch(...) 包装表达式,但我无法取回Expression&lt;Func&lt;ModuleItem, bool&gt;&gt;

如何包装我的动态表达式并取回 Expression&lt;Func&lt;ModuleItem, bool&gt;&gt; 对象以用作 Where 参数?

【问题讨论】:

  • 你有一个IEnumerable,而不是IQueryable,那么你为什么要处理表达式,而不仅仅是代表呢?
  • 你需要一个带有 return 语句的块。
  • 我真的不在乎是表达式还是块。我在这里的约束是将表达式作为字符串并将其提供给 IEnumerable.Where 调用。

标签: c# linq dynamic lambda


【解决方案1】:

经过多次尝试,我得到了这个工作。 解决方案是使用 trycatch 来包装表达式的主体,而不是表达式本身,然后使用表达式参数创建生成的 lambda。

否则我会得到类似(不确定)Func&lt;ModulelItem, bool, bool&gt;

所以最终的代码是

Expression<Func<ModuleItem, bool>> expr = System.Linq.Dynamic.DynamicExpression.ParseLambda<ModuleItem, bool>(value, null);
Expression triedExpr = TryExpression.TryCatch(expr.Body, Expression.Catch(typeof(Exception), Expression.Constant(false)));
Func<ModuleItem, bool> whereDelegate = Expression.Lambda<Func<ModuleItem, bool>>(triedExpr, expr.Parameters).Compile();

【讨论】:

  • 代码示例最后一行需要去掉多余的括号
猜你喜欢
  • 2019-07-25
  • 1970-01-01
  • 1970-01-01
  • 2021-07-22
  • 1970-01-01
  • 1970-01-01
  • 2012-03-29
  • 2011-07-19
  • 2017-02-27
相关资源
最近更新 更多