2011-01-06 3 views
2

Entity Framework CTP5를 사용하여 데이터베이스의 결과를 필터링하려고합니다. 여기 내 현재 방법입니다.GetValue를 사용하여 IQueryable <> 동적 순서 지정/필터링 실패

IQueryable<Form> Forms = DataContext.CreateFormContext().Forms; 
foreach(string header in Headers) { 
    Forms = Forms.Where(f => f.GetType() 
           .GetProperty(header) 
           .GetValue(f, null) 
           .ToString() 
           .IndexOf(filter, 
            StringComparison.InvariantCultureIgnoreCase) >= 0); 
} 

그러나 GetValue는 Entity Framework를 사용하여 작동하지 않습니다. 타입이 IEnumerable<> 일 때 수행합니다. IQueryable<>

동일한 효과를 내기 위해 사용할 수있는 대안이 있습니까?

+1

IEnumerable과 IQueryable의 차이점은 Object (IEnumerable)의 Linq가 매개 변수로 델리게이트를 받아 코드를 직접 실행하므로 컴파일 할 수있는 모든 것이 가능하다는 것입니다. EF는 IQueryable을 사용하고 표현식 파서는 인식하고 파싱 할 수있는 것에 한계가 있습니다. –

답변

3
public static IQueryable<T> Like<T>(this IQueryable<T> source, string propertyName, string keyword) { 
    Type type = typeof(T); 
    ParameterExpression parameter = Expression.Parameter(type, "param"); 
    MemberExpression memberAccess = Expression.MakeMemberAccess(parameter, type.GetProperty(propertyName)); 

    ConstantExpression constant = Expression.Constant("%" + keyword + "%"); 
    MethodInfo contains = memberAccess.Type.GetMethod("Contains"); 

    MethodCallExpression methodExp = Expression.Call(memberAccess, contains, Expression.Constant(keyword)); 
    Expression<Func<T, bool>> lambda = Expression.Lambda<Func<T, bool>>(methodExp, parameter); 
    return source.Where(lambda); 
} 

당신은 내가 전달 된 매개 변수의 유효성 검사를 완료하지 않은 그래서

Forms = Forms.Like(header, filter); 

처럼 부를 것이다. 예를 들어 유효성 검사를 수행중인 속성 유형에 Contains 메서드가 있는지 확인해야합니다. 따라서 int 또는 그와 비슷한 것은 작동하지 않습니다.

+0

이것은 약속하는 것처럼 보입니다 ... 나는 그것을 시도 할 것입니다. – MyNameIsJob

관련 문제