Dynamic Linq Orderby pada iEnumerable & lt; t & gt; / IQueryable & lt; t & gt;
Di Linq dinamik, anda boleh menggunakan rentetan seperti SQL (mis., "Orderby (" Nama, umur desc ")") untuk memerintahkan hasilnya. Walau bagaimanapun, contoh -contoh yang tersedia setakat ini hanya berfungsi dengan iqueryable & lt; t & gt;. Ini menimbulkan persoalan: Adakah mungkin untuk memperluaskan fungsi ini kepada iEnumerable & lt; t & gt ;?
yang diperluaskan kepada ienumerable & lt; t & gt; Kaedah yang menggunakan asqueryable. Walau bagaimanapun, kod di bawah ini berfungsi sebagai logik ekspresi teras yang diperlukan:
menggabungkan fungsi dinamik
public static IOrderedQueryable<T> OrderBy<T>( this IQueryable<T> source, string property) { return ApplyOrder<T>(source, property, "OrderBy"); } public static IOrderedQueryable<T> OrderByDescending<T>( this IQueryable<T> source, string property) { return ApplyOrder<T>(source, property, "OrderByDescending"); } public static IOrderedQueryable<T> ThenBy<T>( this IOrderedQueryable<T> source, string property) { return ApplyOrder<T>(source, property, "ThenBy"); } public static IOrderedQueryable<T> ThenByDescending<T>( this IOrderedQueryable<T> source, string property) { return ApplyOrder<T>(source, property, "ThenByDescending"); } static IOrderedQueryable<T> ApplyOrder<T>( IQueryable<T> source, string property, string methodName) { string[] props = property.Split('.'); Type type = typeof(T); ParameterExpression arg = Expression.Parameter(type, "x"); Expression expr = arg; foreach (string prop in props) { // use reflection to mirror LINQ PropertyInfo pi = type.GetProperty(prop); expr = Expression.Property(expr, pi); type = pi.PropertyType; } Type delegateType = typeof(Func<,>).MakeGenericType(typeof(T), type); LambdaExpression lambda = Expression.Lambda(delegateType, expr, arg); object result = typeof(Queryable).GetMethods().Single( method => method.Name == methodName && method.IsGenericMethodDefinition && method.GetGenericArguments().Length == 2 && method.GetParameters().Length == 2) .MakeGenericMethod(typeof(T), type) .Invoke(null, new object[] { source, lambda }); return (IOrderedQueryable<T>)result; }
untuk senario linq-to-objects dinamik, anda boleh memanfaatkan sistem .Dynamic untuk lebih banyak fleksibiliti.
Atas ialah kandungan terperinci Bolehkah pesanan linq dinamik digunakan untuk `ienumerable` serta` iQueryable`?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!