Heim >Backend-Entwicklung >C++ >Wie kann ich die OrderBy-Eigenschaft in LINQ dynamisch angeben?
In C# ermöglicht die OrderBy-Methode von LINQ das Sortieren von Daten basierend auf angegebenen Eigenschaften oder Ausdrücken. Aber wie geben wir die Eigenschaft oder den Ausdruck, nach der sortiert werden soll, dynamisch an?
Frage:
Anhand eines Parameters möchten wir die Liste der Schüler basierend auf dem angegebenen Attribut sortieren, aber derzeit ist der Attributname im OrderBy-Aufruf fest codiert.
Beispiel:
<code class="language-csharp">List<Student> existingStudents = new List<Student> { new Student { ... }, new Student { ... } }; List<Student> orderByAddress = existingStudents.OrderBy(c => c.Address).ToList();</code>
Ziel:
Wir möchten den Eigenschaftsnamen als Parameter verwenden, anstatt den statischen Eigenschaftsnamen in OrderBy zu verwenden.
Beispiel:
<code class="language-csharp">string param = "City"; List<Student> orderByCity = existingStudents.OrderBy(c => c.City).ToList(); //仍然需要明确指定属性</code>
Lösung:
Mithilfe von Reflektion können wir dynamisch einen OrderBy-Ausdruck erstellen:
<code class="language-csharp">public static IQueryable<T> OrderBy<T>(this IQueryable<T> source, string orderByProperty, bool desc) { // ... (反射代码构建表达式树) ... return source.Provider.CreateQuery<T>(resultExpression); }</code>
Sie können dann dynamisch nach angegebenen Attributen sortieren:
<code class="language-csharp">existingStudents.OrderBy("City", true); // 降序 existingStudents.OrderBy("City", false); // 升序</code>
(Hinweis: Die vollständige Implementierung des Reflexionscodes ist komplizierter und wird hier weggelassen. Sie müssen den System.Linq.Expressions
-Namespace verwenden, um den Ausdrucksbaum zu erstellen und mögliche Ausnahmen zu behandeln, z. B. nicht vorhandene Attribute.) Diese Lösung bietet die Idee der dynamischen Sortierung. Die vollständige Implementierung erfordert das Schreiben von robusterem Code entsprechend der tatsächlichen Situation. Die direkte Verwendung von c => param
ist ein Fehler, da dadurch nur die Parameterzeichenfolge selbst sortiert wird, nicht die Eigenschaften des Schülerobjekts. Reflection muss verwendet werden, um Eigenschaften dynamisch abzurufen und den richtigen Ausdrucksbaum zu erstellen.
Das obige ist der detaillierte Inhalt vonWie kann ich die OrderBy-Eigenschaft in LINQ dynamisch angeben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!