2014-04-11 3 views
5

내 프로젝트에서 일반적인 쿼리를 수행하고 있습니다.'***'매개 변수가 지정된 LINQ to Entities 쿼리 식에 바인딩되지 않았습니다.

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

    } 

하지만 내 GetBooksFields 메소드를 호출 할 때, 그것은 나에게 다음과 같이 예외가 발생합니다 : 나는 EXPR 변수를 디버깅 및 enter image description here

을 내 쿼리 트리, 아래의 코드 목록을 구축하는 표현을 사용 올바른 표현을 얻었습니다 : {m => (m.Name == "sdf")}, 제가 원하는 것이 었습니다. 그러나 나는 왜 내가 오류가 있는지 알지 못합니다.

+2

식 트리로, 그것은 외모는하지 않는 것이 정말 사실 문제. 덕분에 – svick

답변

4

변수 이름에 점을 찍어 매개 변수를 멤버 식으로 해석하도록 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();   
} 
+0

. 하지만 당신의 접근 방식을 시도하고 행에서 오류가 발생했습니다 : Expression.Field (매개 변수, fieldName) 예외 : "TinyFrame.Data.DomainModel.Book"형식에 대해 "Name"필드를 정의하지 않았습니다. 어떤 아이디어? 내 BookDomain 모델에는 "이름"필드가 있습니다. – CharlieShi

+0

필드 또는 속성입니까? Book 클래스를 보여주십시오. – Ani

+0

실수를 저질렀다. 재산이다 : public int ID {get; 세트; } public string Name {get; 세트; } public string Author {get; 세트; } public string Publishment {get; 세트; } public int BookTypeID {get; 세트; } public int BookPlaceID {get; 세트; } public virtual BookType BookType {get; 세트; } public virtual BookPlace BookPlace {get; 세트; } – CharlieShi