dynamische Abfrage mit Ausdrucksbaumstruktur

c# dynamic-linq expression-trees

Frage

Ich habe ein Formular, in dem der Benutzer aus den Dropdown-Listen Folgendes auswählt:

  table_name
  columnName_to_sort_by
  columnName_to_search_in

Der Benutzer muss Search_text in einem Textfeld Search_text

Das Formular soll Daten aus vielen Tabellen beziehen. Ich möchte es vermeiden, die Sortierung zu schreiben und nach jedem Feld für jede der Tabellen zu suchen. Deshalb möchte ich Ausdrucksbäume verwenden. Ich möchte die Abfrage dynamisch erstellen.

Ich möchte eine generische Methode schreiben, die abhängig von Benutzereingaben den Ausdrucksbaum für die Methoden select , where und orderby generiert. Ich kann System.Reflection , um den Type System.Reflection , der abgefragt wird (alle meine Tabellen sind Typen - ich verwende LinqToSql).

Ich weiß nicht, wie ich die Ausdrucksbäume bilden soll.

Folgendes habe ich bisher:

  table_name
  columnName_to_sort_by
  columnName_to_search_in

Wie kann ich select , sort und orderby dynamisch mit Ausdrucksbäumen implementieren?

Beliebte Antwort

Was du hast, ist nah. Wo Sie fragen, "WHAT_SHOULD_BE_HERE", Sie sind neugierig, welcher Ausdruck verwendet werden soll, um den "source" -Parameter für OrderBy anzugeben, der normalerweise vom Operanden ausgeht, wenn er als Erweiterungsmethode verwendet wird. Was Sie tun müssen, ist, Ihr Beispiel so zu ändern, dass es auf IQueryable läuft, und Sie müssen dies als Eingabeparameter akzeptieren. Ersetzen Sie außerdem Ihren Platzhalter WHAT_SHOULD_BE_HERE durch "list.Expression" wie unten gezeigt.

private static IEnumerable<T> GetSortedData<T>(IQueryable<T> list, string sortColumnName) 
{ 
    var type = typeof(T); 
    var property = type.GetProperty(sortColumnName); 
    var parameter = Expression.Parameter(type, "p"); 
    var propertyAccess = Expression.Property(parameter, property); 
    var orderByExp = Expression.Lambda(propertyAccess, parameter); 
    MethodCallExpression resultExp = Expression.Call(typeof(Queryable), "OrderBy", new[] { type, property.PropertyType }, list.Expression, Expression.Quote(orderByExp)); 
    return (IEnumerable<T>)Expression.Lambda(resultExp).Compile().DynamicInvoke(); 
} 

Ich habe das mit dem folgenden Code getestet:

private static IEnumerable<T> GetSortedData<T>(IQueryable<T> list, string sortColumnName) 
{ 
    var type = typeof(T); 
    var property = type.GetProperty(sortColumnName); 
    var parameter = Expression.Parameter(type, "p"); 
    var propertyAccess = Expression.Property(parameter, property); 
    var orderByExp = Expression.Lambda(propertyAccess, parameter); 
    MethodCallExpression resultExp = Expression.Call(typeof(Queryable), "OrderBy", new[] { type, property.PropertyType }, list.Expression, Expression.Quote(orderByExp)); 
    return (IEnumerable<T>)Expression.Lambda(resultExp).Compile().DynamicInvoke(); 
} 

Welches ausgedruckt:

private static IEnumerable<T> GetSortedData<T>(IQueryable<T> list, string sortColumnName) 
{ 
    var type = typeof(T); 
    var property = type.GetProperty(sortColumnName); 
    var parameter = Expression.Parameter(type, "p"); 
    var propertyAccess = Expression.Property(parameter, property); 
    var orderByExp = Expression.Lambda(propertyAccess, parameter); 
    MethodCallExpression resultExp = Expression.Call(typeof(Queryable), "OrderBy", new[] { type, property.PropertyType }, list.Expression, Expression.Quote(orderByExp)); 
    return (IEnumerable<T>)Expression.Lambda(resultExp).Compile().DynamicInvoke(); 
} 



Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum