Je pensais que cela a été corrigé dans 4.0. J'ai cette méthodeEntityframework 4.0 .CreateQuery <T> et OrderBy exception
public IQueryable<T> All(Expression<Func<T,object>> sort)
{
return EntityContext.CreateQuery<T>(EntityName).AsQueryable<T>().OrderBy(sort);
}
cela jette l'exception suivante
Impossible de lancer le type 'System.Int32' de type 'System.Object'. LINQ à Les entités prennent uniquement en charge l'entité de diffusion Types de primitives de modèle de données. Source est System.Data.Entity
Toute idée comment résoudre ce problème ou s'il y a une solution de contournement Cela se produit à chaque appel lorsque l'ordre n'est pas un type de chaîne
IQueryable<Blog> sortedAll = _repository.All(x => x.Title);
depuis titre est chaîne la commandeBon fonctionne bien. mais cela échoue avec d'autres types de données
Depuis que j'ai trouvé cette "mauvaise" solution avant de voir Marc. Je pensais que je poste
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);
}
Merci Marc, Votre solution est bien meilleure que ce que j'ai imaginé. – Sammy