var query = from customer in context.Customers select customer; //! . query = query.OrderBy("name"); var data = query.ToList();
OrderBy OrderByDescending ThenBy ThenByDescending
public static IOrderedQueryable<T> ApplyOrder<T>( this IQueryable<T> source, string property, string methodName )
OrderBy (this IQueryable<T> source, string property) OrderByDescending (this IQueryable<T> source, string property) ThenBy (this IQueryable<T> source, string property) ThenByDescending (this IQueryable<T> source, string property)
public static IOrderedQueryable<T> ApplyOrder<T>( this IQueryable<T> source, string property, string methodName ) { // . x => x.property, var arg = Expression.Parameter(typeof(T), "x"); // . x => x. Expression expr = arg; // . property. x => x.property expr = Expression.Property(expr, property); // , var lambda = Expression.Lambda(expr, arg); // Queryable methodName. var method = typeof(Queryable).GetGenericMethod( methodName, // new[] { typeof(T), expr.Type }, // new[] { source.GetType(), lambda.GetType() } ); // , this . //.. source.OrderBy(x => x.property); return (IOrderedQueryable<T>)method.Invoke(null, new object[] { source, lambda }); }
public static MethodInfo GetGenericMethod( this Type type, string name, Type[] genericTypeArgs, Type[] paramTypes ) { var methods = // from abstractGenericMethod in type.GetMethods(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static) // where abstractGenericMethod.Name == name // generic- where abstractGenericMethod.IsGenericMethod // , let pa = abstractGenericMethod.GetParameters() // where pa.Length == paramTypes.Length // , select abstractGenericMethod.MakeGenericMethod(genericTypeArgs) into concreteGenericMethod // , where concreteGenericMethod.GetParameters().Select(p => p.ParameterType).SequenceEqual(paramTypes, new TestAssignable()) select concreteGenericMethod; // . return methods.FirstOrDefault(); }
private class TestAssignable : IEqualityComparer<Type> { public bool Equals(Type x, Type y) { // y x, return x.IsAssignableFrom(y); } public int GetHashCode(Type obj) { return obj.GetHashCode(); } } : var context = new Models.TestContext(); var query = from customer in context.Customers select customer; query = query .ApplyOrder("name", "OrderBy") .ApplyOrder("surname", "ThenBy") .ApplyOrder("id", "ThenByDescending"); var data = query.ToList();
Source: https://habr.com/ru/post/181065/
All Articles