我正在尝试Utility.GetString(MyEntity.SomePropertyWithRelatedEntity)=="abc"
用表达式访问者替换(简化)之类的函数调用,例如p => p.SubRelatedEntities.FirstOrDefault(sre => sre.SomeFlag==true).SomePropertyWithRelatedEntity
.
这意味着,数据模型如下: MyEntity -> RelatedEntity -> SubRelatedEntity
我正在尝试SubRelatedEntity
根据 中的一些规则从 中返回一个字符串值RelatedEntity
,因此我不必在每次使用中重新编写/复制/粘贴整个过滤规则;这就是为什么我放入一个“调用签名”,所以我的表达式访问者可以识别它并将假调用替换Utility.GetString
为一些复杂的 lambda 表达式。
我的表达式访问者包含以下内容:
public override Expression Visit(Expression node)
{
if (node == null)
return null;
Expression result = null;
if (node.NodeType == ExpressionType.Call)
{
MethodCallExpression mce = node as MethodCallExpression;
if (mce.Method.DeclaringType == typeof(Utility) && mce.Method.Name == "GetString")
{
Expression<Func<RelatedEntity, string>> exp = re => re.SubRelatedEntities.FirstOrDefault(sre => sre.SomeFlag == true).SomeStringValue;
result = exp.Body;
}
else
result = base.Visit(node);
}
else
result = base.Visit(node);
return result;
}
现在,问题是,当调用注入的 lambda 表达式时,“sre”参数没有绑定。经过大量研究,我看到 lambda 参数应该替换为另一个表达式访问者,特别是搜索新参数并用旧参数替换它们。然而,在我的情况下,我没有“旧参数”——我有一个表达式MyEntity.SomePropertyWithRelatedEntity
(例如,一个填充了相关实体的属性),我需要以某种方式将其插入到生成的 lambda 中。
我希望我的问题是可以理解的。感谢您的任何见解!