2013-02-01 2 views
8

linq Where 절에서 사용할 식을 생성하는 함수가 있습니다. Expression <Func<T,bool>> 제네릭 메서드에서 생성 될 때 원하지 않는 변환을 추가합니다.

public static Expression<Func<T,bool>> GetWhereCondition<T>() where T : IActive 
{ 
    return x => x.Active; 
} 

은 (IACTIVE은 '활성'속성을 정의 참고)

가 다른 관련 기능을하고 아이디어가 나는 등 비즈니스 규칙,

을 제어하는 ​​일반 클래스에 필요한 조건을 삽입 할 수 있다는 것입니다

x => Convert(x).Active 

코스 REJ이다 :

문제는 내가이 프로그램을 실행할 때, 반환 된 표현식 (디버거에서 보았을 때) 람다가 포함되어 있습니다 linq : 'LINQ to Entities는 캐스팅 엔터티 데이터 모델 기본 형식 만 지원합니다.'

내 질문은 ...

이 동작을 어떻게 막을 수 있습니까? 전환 할 필요가 없으며 분명히 바람직하지 않습니다. 이것을 막을 수 있습니까?

답변

10

음, 이것은 단지 (변환이 권투 가치 유형입니다) 클래스와 함께 작동 할 필요가 가정, 당신이 class 제약 조건을 추가 할 수 있습니다

public static Expression<Func<T, bool>> GetWhereCondition<T>() where T : class, IActive 
{ 
    return x => x.Active; 
} 

합니다. .. 그리고 전환이 없어집니다.

+2

아, 흥미 롭다. 근본적인 차이점은 "제한된"것 "callvirt"사이의 변화입니다; 이것이 이것이 작동하게하는 것은 흥미 롭다. –

2

이 시도 :

public static Expression<Func<T, bool>> GetWhereCondition<T>() where T : IActive 
{ 
    return x => x.Active; 
} 
+0

나는이 질문에 대한 답을 알고있다. –