2013-03-18 2 views
1

Я пытаюсь сопоставить сравнения между двумя полями, где раньше я делал только поле для сравнения Expression.Constant.BuildPredicate, сравнивая два поля

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 в возвращаемый Лямбда, но он жалуется на слишком много перегрузок.

Спасибо за любую помощь.

ответ

1

Вам нужно переписать правильное выражение, используя тот же параметр, что и левое выражение. Теперь они разные.

Раньше я делал это, создавая Expression.Invoke node to the right side, а затем расширив invocations с помощью ExpressionVisitor.

Смежные вопросы