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.
Pelaksanaan asal cuba membuat kesimpulan jenis ungkapan sortExpression
daripada OrderBy
seperti berikut:
<code>var sortExpression = Expression.Lambda<Func<T, TSortColumn>>(body, param);</code>
Walau bagaimanapun, TSortColumn
hanya boleh ditentukan secara dinamik, menjadikan pendekatan ini tidak dapat 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>
Untuk menggunakan kaedah ini, anda menentukan nama lajur untuk diisih sebagai rentetan:
<code class="language-csharp">IQueryable<MyEntity> query = db.MyEntities.OrderBy("Name");</code>
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!