参数"***"未绑定在指定的LINQ to Entities查询表达式中

Cha*_*Shi 6 .net c# linq expression expression-trees

我正在我的项目中进行常见查询.我使用Expression来构建我的查询树,代码列表如下:

 public IList<Book> GetBooksFields(string fieldName, string fieldValue)
    {
        ParameterExpression paramLeft = Expression.Parameter(typeof(string), "m." + fieldName);
        ParameterExpression paramRight = Expression.Parameter(typeof(string), "\"" + fieldValue + "\"");

        ParameterExpression binaryLeft = Expression.Parameter(typeof(Book),"m");
        BinaryExpression binaryExpr = Expression.Equal(paramLeft, paramRight);

        var expr = Expression.Lambda<Func<Book, bool>>(binaryExpr, binaryLeft);

        return bookRepository.GetMany(expr).ToList();

    }
Run Code Online (Sandbox Code Playgroud)

但是当我调用我的GetBooksFields方法时,它会抛出一个异常,如下所示: 在此输入图像描述

我调试了expr变量并获得了正确的表达式:{ m => (m.Name == "sdf")},这是我想要的,但我不知道为什么我得到错误,thx.

Ani*_*Ani 6

你不能通过在变量名中加入点来"欺骗"LINQ将参数解释为成员表达式.

您必须正确构造表达式树,如下所示(编辑:根据您的注释将字段更改为属性):

public IList<Book> GetBooksFields(string propertyName, string propertyValue)
{
     var parameter = Expression.Parameter(typeof(Book), "book");

     var left = Expression.Property(parameter, propertyName);   

     var convertedValue = Convert.ChangeType
                          ( 
                              propertyValue, 
                              typeof(Book).GetProperty(propertyName).PropertyType
                          );

     var right = Expression.Constant(convertedValue);

     var binaryExpr = Expression.Equal(left, right);        
     var expr = Expression.Lambda<Func<Book, bool>>(binaryExpr, parameter);     

     return bookRepository.GetMany(expr).ToList();          
}
Run Code Online (Sandbox Code Playgroud)