2011-01-11 5 views
4

Ich habe die folgende Funktion, die mir verschiedene Werte basierend auf den Eigenschaften eines Objekts extrahiert, hier Client.OrderBy mit einem String keySelector

Ich mache das, weil ich nicht weiß, vor welchen Eigenschaftenwerte ich extrahieren muss. Es funktioniert, nur das Ergebnis ist nicht sortiert.

Können Sie mir bitte helfen, die Sortierung zu korrigieren, damit der OrderBy wie erwartet funktioniert?

Die Eigenschaften sind Strings und ich muss die Sortierung nicht verketten. Ich muss auch nicht die Sortierreihenfolge angeben.

Vielen Dank im Voraus, John.

Antwort

7

Ihre keySelector gibt derzeit die gleiche Zeichenfolge für jeden (der Eigenschaftsname) zurück; und da LINQ typischerweise eine stabile Sortierung ist, führt dies zu keiner Gesamtänderung. Da Sie bereits auf die String-Werte projiziert haben, können Sie einfach ein triviales x=>x Mapping hier verwenden:

var values = this.ObjectContext.Clients.Select(
    CreateSelectorExpression(propertyName)).Distinct().OrderBy(x => x); 

durch die Einzelteile zu bestellen, mich.

+0

Vielen Dank für die Antwort und für die Erklärung. Es macht viel Sinn. Danke noch einmal. – Jonx

4

Danke für die elegante Lösung. Ich habe die CreateSelectorExpression-Methode erweitert, sodass sie im obigen Beispiel außerhalb der Client-Klasse verwendet werden kann.

public static Expression<Func<T, string>> CreateSelectorExpression<T>(string propertyName) 
{ 
    var paramterExpression = Expression.Parameter(typeof(T)); 
     return (Expression<Func<T, string>>)Expression.Lambda(Expression.PropertyOrField(paramterExpression, propertyName), 
                   paramterExpression); 
}  

Nutzungs

Func<IQueryable<YourEntity>, IOrderedQueryable<YourEntity>> orderBy = o => o.OrderByDescending(CreateSelectorExpression<YourEntity>("Entity Property Name"));