Дерево выражений LINQ - параметр 'x' не был связан в указанном выражении запроса LINQ to Entities - PullRequest
0 голосов
/ 15 декабря 2018

Я пытаюсь построить дерево выражений динамически для извлечения данных из базы данных.

Для этого используются следующие коды.

Expression<Func<Client, bool>> expression = x => true;
foreach (var item in searchParams)
{
    var operatorType = ExpressionType.Equal;
    string propertyName = null;
    object value = null;
    string keyValue = item.Value;

    if (item.Key == Constants.SearchParameterNames.Id)
    {
        int val = 0;
        if (int.TryParse(keyValue, out val))
            value = val;
        propertyName = "ClientID";
    }
    else if (item.Key == Constants.SearchParameterNames.Lastupdate)
    {
        DateTime dateTime;
        if (DateTime.TryParse(keyValue, out dateTime))
            value = dateTime;
        propertyName = "LastChange";
    }

    if (!string.IsNullOrWhiteSpace(propertyName) && value != null)
    {

            var exp = GetBinaryOperation<Client>(propertyName, operatorType, value);
            var exp1 = Expression.And(expression.Body, exp);
            expression = Expression.Lambda<Func<Client, bool>>(exp1, expression.Parameters);
    }

}
var client = _clientRepository.FindBy(expression).ToList();

при выполнении _clientRepository.FindBy(expression).ToList() Яполучение исключения

Параметр 'x' не был связан в указанном выражении запроса LINQ to Entities.

Метод, использованный для создания выражения:

public BinaryExpression GetBinaryOperation<T>(string propertyName, ExpressionType type, object value)
{

    var parameterExpression = Expression.Parameter(typeof(T), "x");
    var memberExpression = Expression.Property(parameterExpression, propertyName); 
    var propertyType = GetMemberType(memberExpression);
    var rhs = Expression.Constant(value);
    var binaryExpression = Expression.MakeBinary(type, memberExpression, rhs);

    return binaryExpression; 
}

1 Ответ

0 голосов
/ 15 декабря 2018

При создании такого выражения необходимо сохранить экземпляр выражения параметра верхнего уровня.Когда вы создаете новое выражение параметра в функции GetBinaryOperation, это будет другой экземпляр (следовательно, термин не связан ), независимо от того, что его имя совпадает"x".

Вместо создания нового экземпляра параметра вы должны передать исходный параметр LambdaExpression "x" в функцию GetBinaryOperation, используя, например, expression.Parameters[0].

* 1014.* В общем, в этом случае вы должны использовать same parameter expression instance по всему дереву выражений.
...