Rumah > pembangunan bahagian belakang > C++ > Bagaimana untuk Melaksanakan Kaedah Sambungan Generik untuk Isih Dinamik pada IQueryable Menggunakan Nama Lajur Rentetan?

Bagaimana untuk Melaksanakan Kaedah Sambungan Generik untuk Isih Dinamik pada IQueryable Menggunakan Nama Lajur Rentetan?

Mary-Kate Olsen
Lepaskan: 2025-01-14 09:45:43
asal
876 orang telah melayarinya

How to Implement a Generic Extension Method for Dynamic Sorting on IQueryable Using String Column Names?

Kaedah sambungan generik untuk mengisih IQueryable secara dinamik menggunakan nama lajur rentetan

Artikel ini meneroka cara melaksanakan kaedah sambungan generik ApplySortFilter yang membenarkan pengisihan dinamik bagi koleksi IQueryable menggunakan nama lajur rentetan. Masalah utama ialah bagaimana untuk menentukan jenis yang betul untuk kaedah OrderBy semasa masa jalan.

Percubaan awal

Pelaksanaan asal cuba membuat kesimpulan jenis ungkapan sortExpression daripada OrderBy seperti berikut:

<code>var sortExpression = Expression.Lambda<Func<T, TSortColumn>>(body, param);</code>
Salin selepas log masuk

Walau bagaimanapun, TSortColumn hanya boleh ditentukan secara dinamik, menjadikan pendekatan ini tidak dapat dilaksanakan.

Penyelesaian yang boleh dilaksanakan

Dalam projek LINQ yang serupa dengan SQL, penyelesaian ditemui:

<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;

    // 确定排序方向
    if (ordering.StartsWith("-"))
    {
        resultExp = Expression.Call(typeof(Queryable), "OrderByDescending", new Type[] { type, property.PropertyType }, source.Expression, Expression.Quote(orderByExp));
    }
    else
    {
        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

Cara menggunakan

Untuk menggunakan kaedah ini, anda menentukan nama lajur untuk diisih sebagai rentetan:

<code class="language-csharp">IQueryable<MyEntity> query = db.MyEntities.OrderBy("Name");</code>
Salin selepas log masuk

Ini akan menjana pertanyaan yang diisih mengikut lajur Nama dalam tertib menaik.

Output yang disemak ini memberikan penerangan yang lebih ringkas dan tepat dari segi teknikal tentang kod dan tujuannya, sambil mengekalkan imej asal Pemformatan juga dipertingkatkan untuk kebolehbacaan.

Atas ialah kandungan terperinci Bagaimana untuk Melaksanakan Kaedah Sambungan Generik untuk Isih Dinamik pada IQueryable Menggunakan Nama Lajur Rentetan?. 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