Heim >Backend-Entwicklung >C++ >Wie ordne ich ein IQueryable dynamisch mithilfe eines String-Spaltennamens in einer generischen Erweiterungsmethode an?
OrderBy auf IQueryable anwenden
in der generischen Erweiterungsmethode unter Verwendung des String-SpaltennamensBeim Versuch, OrderBy mithilfe eines String-Spaltennamens in einer generischen Erweiterungsmethode auf ein IQueryable anzuwenden, stießen wir auf eine Herausforderung. Der Typ von OrderBy kann nicht aus sortExpression abgeleitet werden und muss zur Laufzeit explizit angegeben werden.
Eine Möglichkeit besteht darin, sortExpression als Lambda-Ausdruck eines bestimmten Typs zu definieren:
<code>var sortExpression = Expression.Lambda<Func<T, TSortColumn>>(body, param);</code>
Dieser Ansatz erfordert jedoch die Kenntnis des TSortColumn-Typs zur Kompilierungszeit, was nicht immer möglich ist.
Um diese Einschränkung zu überwinden, können wir eine Technik nutzen, die der im LINQ to SQL-Projekt verwendeten ähnelt. Hier ist ein geänderter Codeausschnitt:
<code class="language-csharp">public static IQueryable<T> OrderBy<T>(this IQueryable<T> source, string ordering, params object[] values) { var type = typeof(T); var property = type.GetProperty(ordering); var parameter = Expression.Parameter(type, "p"); var propertyAccess = Expression.MakeMemberAccess(parameter, property); var orderByExp = Expression.Lambda(propertyAccess, parameter); MethodCallExpression resultExp = Expression.Call(typeof(Queryable), "OrderBy", new Type[] { type, property.PropertyType }, source.Expression, Expression.Quote(orderByExp)); return source.Provider.CreateQuery<T>(resultExp); }</code>
Mit dieser Methode können Sie die zu sortierenden Eigenschaften mithilfe des Parameters für die Zeichenfolgenreihenfolge dynamisch angeben. Für die absteigende Sortierung verwenden Sie einfach „OrderByDescending“ anstelle von „OrderBy“ im MethodCallExpression.
Diese verbesserte Version bietet eine prägnantere Erklärung und vermeidet unnötige Wiederholungen. Der Code bleibt funktional identisch.
Das obige ist der detaillierte Inhalt vonWie ordne ich ein IQueryable dynamisch mithilfe eines String-Spaltennamens in einer generischen Erweiterungsmethode an?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!