Я думал, что это было исправлено в 4.0. У меня есть этот метод
public IQueryable<T> All(Expression<Func<T,object>> sort)
{
return EntityContext.CreateQuery<T>(EntityName).AsQueryable<T>().OrderBy(sort);
}
это выдает следующее исключение
Невозможно привести тип 'System.Int32'
набрать 'System.Object'. LINQ to
Сущность поддерживает только приведение сущностей
Модель данных примитивных типов. Источник
System.Data.Entity
Любая идея, как это исправить или есть ли обходной путь
Это происходит с каждым вызовом, когда заказ не является строковым типом данных
IQueryable<Blog> sortedAll = _repository.All(x => x.Title);
, поскольку Title является строкой, orderBy работает нормально. но не с любыми другими типами данных
Так как я придумал это "плохое" решение до того, как увидел Марка. Я думал, что выложить это
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);
}