2010-09-30 8 views
0

Essayer d'obtenir un OrderBy sur un IQueryable pour travailler, ne pas avoir beaucoup de chance.Aide avec générique LINQ OrderBy Lambda Expression

Voici ma méthode:

public ICollection<T> FindAll<T>(Expression<Func<T,bool>> predicate, Expression<Func<T,int>> orderingKey) where T : Post 
{ 
    return repository 
      .Find() 
      .Where(predicate) 
      .OfType<T>() 
      .OrderBy(orderingKey) 
      .ToPagedList(); 
} 

La commande fonctionne si je fais ceci:

FindAll(p => p.PostName == "Foo", p => p.PostId); 

Mais pas si je veux faire:

FindAll(p => p.PostName == "Foo", p => p.DateModified); 

Il ne travail bien sûr, parce que j'ai déclaré l'expression T,int, alors que l'expression ci-dessus est de type T,DateTime

Comment puis-je le déclarer afin que je puisse OrderBy any propriété de mon entité (Publier)?

Il s'agit de LINQ-Entities (Entity Framework 4.0).

+0

Jetez un oeil à [cette réponse] [1] Vive [1]: http://stackoverflow.com/a/12920596/ 1139347 – joaopintocruz

Répondre

3

Queryable.OrderBy prend un sélecteur à clé avec le type:

Expression<Func<TSource, TKey> keySelector> 

Si vous changez orderingKey à une expression de ce type, alors il fonctionnera. Vous devrez également ajouter un autre paramètre de type.

public ICollection<T> FindAll<T, TKey>(
    Expression<Func<T, bool>> predicate, 
    Expression<Func<T, TKey>> orderingKey 
) where T : Post 
+0

donc a) qu'est-ce que je change ma déclaration de méthode à, et b) comment puis-je changer l'utilisation? – RPM1984

+0

@ RPM1984: Vous n'avez pas besoin de changer l'utilisation. –

+0

juste vu votre montage, merci. – RPM1984

0

Vous devez avoir au moins un type de paramètre générique défini pour la clé de commande. Au lieu de renvoyer int, renvoyez un type générique.

par exemple,

public ICollection<TPost> FindAll<TPost,TOrder>(Expression<Func<TPost,bool>> predicate, Expression<Func<TPost,TOrder>> orderingKey) where TPost : Post 
{ 
    return repository 
      .Find() 
      .Where(predicate) 
      .OfType<TPost>() 
      .OrderBy(orderingKey) 
      .ToPagedList(); 
}