Rumah >pembangunan bahagian belakang >C++ >Bagaimana Memesan IQueryable Secara Dinamik Menggunakan Nama Lajur Rentetan dalam Kaedah Sambungan Generik?
Gunakan OrderBy ke IQueryable
dalam kaedah sambungan generik menggunakan nama lajur rentetanKami menghadapi cabaran apabila cuba menggunakan OrderBy pada IQueryable menggunakan nama lajur rentetan dalam kaedah sambungan generik. Jenis OrderBy tidak boleh disimpulkan daripada sortExpression dan perlu dinyatakan secara eksplisit pada masa jalan.
Salah satu cara ialah dengan mentakrifkan sortExpression sebagai ungkapan Lambda daripada jenis yang ditentukan:
<code>var sortExpression = Expression.Lambda<Func<T, TSortColumn>>(body, param);</code>
Walau bagaimanapun, pendekatan ini bergantung pada mengetahui jenis TSortColumn pada masa penyusunan, yang tidak selalu boleh dilakukan.
Untuk mengatasi had ini, kami boleh memanfaatkan teknik yang serupa dengan yang digunakan dalam projek LINQ to SQL. Berikut ialah coretan kod yang diubah suai:
<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>
Kaedah ini membolehkan anda menentukan sifat secara dinamik untuk diisih menggunakan parameter susunan rentetan. Untuk pengisihan menurun, hanya gunakan "OrderByDescending" dan bukannya "OrderBy" dalam MethodCallExpression.
Versi yang dipertingkatkan ini menawarkan penjelasan yang lebih ringkas dan mengelakkan pengulangan yang tidak diperlukan
Atas ialah kandungan terperinci Bagaimana Memesan IQueryable Secara Dinamik Menggunakan Nama Lajur Rentetan dalam Kaedah Sambungan Generik?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!