2010-06-13 4 views
2

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); 
    } 

Répondre

3

Je ne peux pas changer le moteur d'exécution, mais ne peux pas vous travailler tout autour d'elle? à savoir

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

et

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

?

+0

Merci Marc, Votre solution est bien meilleure que ce que j'ai imaginé. – Sammy

Questions connexes