C# 参数'***';未在指定的LINQ to Entities查询表达式中绑定

C# 参数'***';未在指定的LINQ to Entities查询表达式中绑定,c#,.net,linq,expression,expression-trees,C#,.net,Linq,Expression,Expression Trees,我正在我的项目中执行一个常见的查询。我使用表达式构建查询树,代码列表如下: public IList<Book> GetBooksFields(string fieldName, string fieldValue) { ParameterExpression paramLeft = Expression.Parameter(typeof(string), "m." + fieldName); ParameterExpression para

我正在我的项目中执行一个常见的查询。我使用表达式构建查询树,代码列表如下:

 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();

    }
public IList GetBooksFields(字符串字段名,字符串字段值)
{
ParameterExpression paramLeft=表达式.参数(类型(字符串),“m.”+字段名);
ParameterExpression paramRight=表达式。参数(类型(字符串),“\”+字段值+“\”);
ParameterExpression binaryLeft=表达式.参数(typeof(Book),“m”);
BinaryExpression binaryExpr=Expression.Equal(paramLeft,paramRight);
var expr=Expression.Lambda(binaryExpr,binaryLeft);
返回bookRepository.GetMany(expr.ToList();
}
但是当我调用我的
GetBooksFields
方法时,它会抛出一个异常,如下所示:

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

不能通过在变量名中插入点来“欺骗”LINQ将参数解释为成员表达式

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

public IList GetBooksFields(string propertyName,string propertyValue)
{
var参数=表达式参数(书的类型),“书”);
var left=Expression.Property(参数,propertyName);
var convertedValue=Convert.ChangeType
( 
财产价值,
typeof(Book).GetProperty(propertyName).PropertyType
);
var right=表达式常数(convertedValue);
var binaryExpr=Expression.Equal(左、右);
var expr=Expression.Lambda(二进制expr,参数);
返回bookRepository.GetMany(expr.ToList();
}

谢谢。但我尝试了您的方法,在第行:Expression.Field(参数,fieldName)处出错,例外情况是:没有为类型“TinyFrame.Data.DomainModel.Book”定义字段“Name”。有什么想法吗?我可以在我的BookDomainmodel中看到,有“Name”字段。它是字段还是属性?让我们看看你的Book class.sry因为我的错误,它是一个属性:public int ID{get;set;}public string Name{get;set;}public string Author{get;set;}public string publishipment{get;set;}public int BookTypeID{get;set;}public int BookPlaceID{get;set;}public virtual BookType BookType{get;set;}public virtual BookPlace BookPlace{get;set;}我将所有字段修改为property,现在它可以正常工作。@您也可以使用
Expression.PropertyOrField()。
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();          
}