Rumah > pembangunan bahagian belakang > C++ > Bagaimana Memesan IQueryable Secara Dinamik Menggunakan Nama Lajur Rentetan dalam Kaedah Sambungan Generik?

Bagaimana Memesan IQueryable Secara Dinamik Menggunakan Nama Lajur Rentetan dalam Kaedah Sambungan Generik?

Mary-Kate Olsen
Lepaskan: 2025-01-14 07:17:42
asal
278 orang telah melayarinya

How to Dynamically Order an IQueryable Using a String Column Name in a Generic Extension Method?

Gunakan OrderBy ke IQueryable

dalam kaedah sambungan generik menggunakan nama lajur rentetan

Kami 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>
Salin selepas log masuk

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>
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan