2016-05-06 14 views
0

Ich bin diesen großen generische Art Helfer von Herrn Cincura (http://blog.cincura.net/229310-sorting-in-iqueryable-using-string-as-column-name/) mit Aufzeichnungen von SQL Server sortieren zurück Entity Framework mitGenerisches Sortieren nach ähnlichem Objekt

private static IOrderedQueryable<T> OrderingHelper<T>(IQueryable<T> source, string propertyName, bool descending, bool anotherLevel) 
    { 
     ParameterExpression param = Expression.Parameter(typeof(T), string.Empty); // I don't care about some naming 
     MemberExpression property = Expression.PropertyOrField(param, propertyName); 
     LambdaExpression sort = Expression.Lambda(property, param); 
     MethodCallExpression call = Expression.Call(
      typeof(Queryable), 
      (!anotherLevel ? "OrderBy" : "ThenBy") + (descending ? "Descending" : string.Empty), 
      new[] { typeof(T), property.Type }, 
      source.Expression, 
      Expression.Quote(sort)); 
     return (IOrderedQueryable<T>)source.Provider.CreateQuery<T>(call); 
    } 

Das Problem ist, es funktioniert jede Eigenschaft bilden, das Objekt, aber nicht für die Eigenschaften eines verwandten Objekts. wenn ich

public foo FOO; 

public class foo 
     { 
      public string name {get;set}; 
      public bar Bar {get;set;} 

    } 

    public class bar 
    { 
     public string name {get;set;} 
    } 

haben kann ich von FOO.name sortieren aber nicht von FOO.Bar.name aber nicht von foo.Bar.name.

Ich denke, ich muss einen anderen Ausdruck zuordnen, aber meine bisherigen Versuche ergaben keine Ergebnisse. Ich würde jede Hilfe schätzen.

+0

Dies wäre viel besser lesbar, wenn Sie Klassen- und Variablennamen verwenden, die sich nicht nur nach Gehäuse unterscheiden. Außerdem zeigen Sie, wie Sie das 'IQueryable' erstellt und' OrderingHelper' verwendet haben – derpirscher

Antwort

0

Sie haben die verschachtelten Mitglied Ausdruck selbst zu bauen, für Beispiel, indem propertyName-Parameter geteilt und durchgeschleift wird:

0

Fabrikat bar vergleichbar

public class bar : IComparable 
    { 
     public string name { get; set; } 

     public int CompareTo(object other) 
     { 
      return this.name.CompareTo(((bar)other).name); 
     } 
    } 
0

Um Eigenschaftenpfad zu unterstützen, ersetzen Sie die Zeile

MemberExpression property = Expression.PropertyOrField(param, propertyName); 

mit

var property = propertyName.Split('.').Aggregate((Expression)param, Expression.PropertyOrField);