繁体   English   中英

使用递归创建(Lambda)表达式

[英]Creating an (Lambda) Expression using recursion

我有以下字典:

Dictionary<string, PropertyInfo> filterProperties;

该词典的内容可以像这样:

- "Language": [QueryData.Lang],
- "Id": [Querydata.UserId]

每个字符串键都映射到我的QueryData类型的属性。

现在,假设我有以下QueryData实例:

QueryData: { Lang= "en", UserId = "mcicero" }

以上一个字典为例,我要构建以下表达式:

e => e.Language == "en" && e.Id == "mcicero";

如您所见,字典键用于访问e的属性,而字典值(QueryData属性)用于在二进制等式表达式中指定常量。

eEntity类型,并保证具有此属性。

结果表达式应为Expression<Func<Entity, bool>>

如何使用递归构建此表达式?

我之所以说递归,是因为它听起来像是一种自然的解决方案,但最好使用迭代的解决方案。

我尝试了迭代的替代方法,并最终得到了难看且不太容易理解的代码。

但是,我无法为此问题创建递归方法。

无需创建单个表达式,只需将它们组合成一个迭代循环即可:

// For an IEnumerable<Expression> in "expressions"
Expression left = null;
foreach(var right in expressions)
{
  if(left == null)
    left = right;
  else
    left = Expression.And(left, right);
}
// Combined expression is in "left"
// Don't forget it will be null if there were no expressions provided...

或与LINQ一行:

var expr = expressions.Aggregate(Expression.And);

对于感兴趣的人,只需一行:

Expression expr = filterProperties.Select(i => Expression.Equal(
                                                  Expression.Property(entityParameter, i.Key),
                                                  Expression.Constant(i.Value.GetValue(queryObj))
                                         )).Aggregate(Expression.And);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM