2010-11-13 2 views
0

Je construis une petite classe de recherche qui utilise PredicateBuilder pour obtenir des résultats:LINQ tri: ne peut pas commander par type « System.IComparable »

voici ma requête:

var results = (from u in db.users 
       join p in db.profiles on u.userId equals p.UserID 
       select new SearchResult { Profile = p, User = u }).AsQueryable().Where(predicate); 

résultats deviennent une dénombrable de SearchResult:

public class SearchResult 
{ 
    public user User { get; set; } 
    public profile Profile { get; set; } 
} 

Cela fonctionne bien, mais maintenant je veux aussi faire le tri:

var sortedResult = results.OrderBy(x => x.User.timeAdded); 

Et cela fonctionne bien aussi, sauf quand je fais:

Expression<Func<SearchResult, IComparable>> OrderByExpression = x => x.User.timeAdded; 
var sortedResult = results.OrderBy(OrderByExpression); 

Je reçois cette erreur: ne peut pas commander par type « System.IComparable ».

N'est-ce pas exactement la même chose que de placer la requête lambda directement dans la clause orderby (qui fonctionne)? La raison pour laquelle je fais cela est que je veux passer l'expression orderby à une autre fonction.

Quelqu'un sait ce que je fais mal? Merci!

+0

Veuillez montrer l'implémentation de OrderByExpression – Dyppl

Répondre

0

Avez-vous essayé (pas d'accès à VS en ce moment, il est donc plus d'une estimation):

Func<SearchResult, IComparable> OrderByFunc = x => x.User.timeAdded; 
var sortedResult = results.OrderBy(OrderByFunc); 
1

OrderBy attend une expression de type Expression<Func<TSource, TResult>>. Dans votre code, TSource est SearchResult et TResult est IComparable, qui ne peut pas être traduit en requête DB. Vous voulez que TResult soit un type primitif égal au type concret de timeAdded, (étant donné le nom, je suppose que c'est un DateTime?) Pour que cela fonctionne.

Expression<Func<SearchResult, DateTime>> OrderByExpression = x => x.User.timeAdded; 
var sortedResult = results.OrderBy(OrderByExpression); 
Questions connexes