2010-06-13 2 views
2

이 문제는 4.0에서 수정 된 것으로 생각됩니다. 나는 '선택 System.Int32' 은 '으로 System.Object'를 입력이 다음과 같은 예외 유형을 캐스팅 할 수 없습니다Entityframework 4.0 .CreateQuery 및 OrderBy 예외

를 throw이 방법을

public IQueryable<T> All(Expression<Func<T,object>> sort) 
    { 
     return EntityContext.CreateQuery<T>(EntityName).AsQueryable<T>().OrderBy(sort); 
    } 

있습니다. LINQ to 엔터티는 캐스팅 엔터티 데이터 모델 기본 형식 만 지원합니다. 소스는이 문제를 해결하는 방법을 System.Data.Entity

어떤 생각이나 해결 방법 이 있다면 순서는 문자열 데이터 형식이 아닌 경우이 모든 호출에 발생하는 제목이 때문에

IQueryable<Blog> sortedAll = _repository.All(x => x.Title); 

orderBy는 잘 동작합니다. 하지만 다른 데이터 유형에서는 실패합니다.

Marc 's를보기 전에이 "나쁨"해결책을 생각해 냈습니다. 내가 그것을 게시 할 생각했다

public IQueryable<T> All(Expression<Func<T,object>> sort) 
    { 

     var expresssionType = sort.Body.GetType(); 
     string propertyName= expresssionType == typeof(System.Linq.Expressions.UnaryExpression) ? ((MemberExpression)((UnaryExpression)sort.Body).Operand).Member.Name : ((MemberExpression)sort.Body).Member.Name; 
     var items= EntityContext.CreateQuery<T>(EntityName).AsQueryable<T>(); 
     var type = typeof(T); 
     var expressionProperty = type.GetProperty(propertyName); 
     var exPressionparameter = Expression.Parameter(type, "p"); 
     var propertyAccess = Expression.MakeMemberAccess(exPressionparameter, expressionProperty); 
     var orderByExp = Expression.Lambda(propertyAccess, exPressionparameter); 
     Expression resultExp = Expression.Call(typeof(Queryable), "OrderBy", new Type[] { type, expressionProperty.PropertyType }, items.Expression, Expression.Quote(orderByExp)); 
     return items.AsQueryable().Provider.CreateQuery<T>(resultExp); 
    } 

답변

3

나는 런타임을 변경할 수 없지만 그 문제를 해결할 수는 없습니까? 즉

public IQueryable<T> All<TValue>(Expression<Func<T,TValue>> sort) 
{ 
    return EntityContext.CreateQuery<T>(EntityName) 
      .AsQueryable<T>().OrderBy<T,TValue>(sort); 
} 

IQueryable<Blog> sortedAll = _repository.All(x => x.SomeProp); 

?

+0

감사합니다. Marc, 당신의 해결책은 내가 생각한 것보다 훨씬 낫습니다. – Sammy

관련 문제