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);
}
감사합니다. Marc, 당신의 해결책은 내가 생각한 것보다 훨씬 낫습니다. – Sammy