Spesifikasi dinamik parameter LINQ OrderBy
Dalam senario di mana anda perlu menentukan secara dinamik medan yang digunakan dalam operasi LINQ OrderBy, anda boleh menggunakan teknologi pantulan untuk mencapai ini.
Contoh:
Andaikan terdapat senarai pelajar existingStudents
dan parameter param
mewakili medan yang hendak diisih.
List<student> existingStudents = new List<student> { ... }; string param = "City";
Pelaksanaan standard:
Kaedah lalai memanggil OrderBy dengan nama sifat berkod keras untuk mengisih:
List<student> orderedByAddress = existingStudents.OrderBy(c => c.Address).ToList();
Pelaksanaan dinamik:
Menggunakan refleksi, anda boleh mencipta ungkapan dinamik:
public static IQueryable<T> OrderBy<T>(this IQueryable<T> source, string orderByProperty, bool desc) { // 确定排序表达式 string command = desc ? "OrderByDescending" : "OrderBy"; var type = typeof(T); var property = type.GetProperty(orderByProperty); var parameter = Expression.Parameter(type, "p"); var propertyAccess = Expression.MakeMemberAccess(parameter, property); var orderByExpression = Expression.Lambda(propertyAccess, parameter); // 构建动态查询表达式 var resultExpression = Expression.Call(typeof(Queryable), command, new Type[] { type, property.PropertyType }, source.Expression, Expression.Quote(orderByExpression)); return source.Provider.CreateQuery<T>(resultExpression); }
Penggunaan:
Kini boleh membuat pesanan secara dinamik mengikut mana-mana atribut menggunakan kaedah sambungan OrderBy:
List<student> orderbyAddress = existingStudents.OrderBy("City", true); // 降序 List<student> orderbyName = existingStudents.OrderBy("Name", false); // 升序
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menentukan Secara Dinamik Medan OrderBy dalam LINQ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!