BuildPredicate比较两个字段

时间:2013-03-18 16:38:53

标签: c# lambda linq-to-entities expression automapper

我正在尝试映射两个字段之间的比较,之前我只进行了Expression.Constant比较的字段。

  private static Expression<Func<TDomainModel, bool>> BuildPredicate<TDomainModel>(string leftPropName, string rightPropName, TypeMap map)
  {
        PropertyMap leftPropMap = map.GetPropertyMaps().FirstOrDefault(pro => pro.DestinationProperty.Name == leftPropName);
        Expression leftParam = leftPropMap.CustomExpression.Body;

        PropertyMap rightPropMap = map.GetPropertyMaps().FirstOrDefault(pro => pro.DestinationProperty.Name == rightPropName);
        Expression rightParam = rightPropMap.CustomExpression.Body;

        Expression operatorBody = Expression.GreaterThanOrEqual(leftParam, rightParam);

        return Expression.Lambda<Func<TDomainModel, bool>>(operatorBody, leftPropMap.CustomExpression.Parameters[0]);
  }

但是我总是得到例外......

The parameter 's' was not bound in the specified LINQ to Entities query expression.

两个属性都在同一个实体上,甚至在映射中使用's'。不知道如何解决这个问题。我已经尝试将两个CustomExpression.Parameters值放入返回的Lambda中,但它会抱怨过多的重载。

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

您需要使用与左表达式相同的参数重写正确的表达式。他们现在不一样了。

我曾经这样做创建Expression.Invoke node to the right side,然后使用ExpressionVisitor扩展调用。