2014-06-22 4 views
2

아래 코드를 실행할 때 Unable to cast object of type 'System.Linq.Expressions.FieldExpression' to type 'System.Linq.Expressions.LambdaExpression' 오류가 발생합니다.LINQ to SQL을 사용하여 LambdaExpression으로 FieldExpression을 캐스팅하는 중 오류

이 코드의 의도는 특정 문자열이 들어있는 레코드에 대한 레코드 (Entity Framework Code First/Linq to SQL)를 필터링 할 수있게하려는 것입니다.

NB : 내가 타사 라이브러리 LinqKit을 사용하고 있습니다 : http://www.albahari.com/nutshell/predicatebuilder.aspx

FilterHelper<Country> helper = new FilterHelper<Country>(); 
helper.AddContains(searchAlpha2, c => c.Alpha2); 
helper.AddContains(searchAlpha3, c => c.Alpha3); 
helper.AddContains(searchName, c => c.Name); 

IQueryable<Country> countries = db.Countries.AsExpandable().Where(helper.Predicate); 

...

public class FilterHelper<T> 
{ 
    public delegate string GetColumn<T>(T item); 

    private Expression<Func<T,bool>> predicate; 

    public FilterHelper() 
    { 
     this.predicate = PredicateBuilder.True<T>(); 
    } 
    public void AddContains(string searchText, GetColumn<T> getColumn) 
    { 
     if (!string.IsNullOrWhiteSpace(searchText)) 
      predicate = predicate.And(c => getColumn(c) != null ? getColumn(c).Contains(searchText) : false); 
    } 
    public Expression<Func<T,bool>> Predicate 
    { 
     get { return this.predicate; } 
    } 

} 

내가 위의 오류를 피하기 위해이를 다시 작성 수있는 방법에 대한 어떤 제안?

NB : CodeReview에도 리팩터링과 관련된 원래 질문이 있습니다. https://codereview.stackexchange.com/questions/54888/refactor-c-linq-code-to-reduce-duplication

+0

링크 된 사이트 또는 NuGet에서 DLL을 사용하고 있습니까? 이 문제가 수정 된 것 같아 아직 NuGet 버전을 사용하지 않으려 고 시도해보십시오. – Mark

+0

고맙습니다. 나는 그 사이트에서 하나를 사용했다; NuGet 버전으로 지금 대체하십시오 ... – JohnLBevan

+0

슬프게도 여전히 동일하게 유지되고 있습니다 (v1.1.1/nuget/관련 페이지 : https://www.nuget.org/packages/LinqKit/) – JohnLBevan

답변

1

FieldExpression은 LambdaExpression이 아닙니다. 하나를 표현의 본문으로 만들 수 있습니다. 디버거에서 당신은 A LambdaExpression의 구조를 탐험하기 위해 다음과 같은 시도 할 수 있습니다 :

Expression<Func<U,T>> f = t => t.FieldName; 

을 다음 디버거에서 입력 LambdaExpression이다 F, 및 필드의 표현이다 LambdaExpression의 몸을 봐주세요.