рдбрд╛рдпрдиреЗрдорд┐рдХ рд▓рд╛рдЗрдирдХ рдХреНрд╡реЗрд╢реНрдЪрди рдпрд╛ рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдЯреНрд░реА

рдкрд░рд┐рдЪрдп


Linq to Entity рдЖрдкрдХреЛ рд╕реНрдереИрддрд┐рдХ рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдБрдЪ рдХреЗ рд╕рд╛рде рдмрд╣реБрдд рд╣реА рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЬрдЯрд┐рд▓ рдкреНрд░рд╢реНрди рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдХрднреА-рдХрднреА рдЖрдкрдХреЛ рдкреНрд░рд╢реНрдиреЛрдВ рдХреЛ рдереЛрдбрд╝рд╛ рдФрд░ рдЧрддрд┐рд╢реАрд▓ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕реНрддрдВрдн рдирд╛рдо рд╕реНрдЯреНрд░рд┐рдВрдЧ рджреНрд╡рд╛рд░рд╛ рджрд┐рдП рдЬрд╛рдиреЗ рдкрд░ рдЫрдБрдЯрд╛рдИ рдЬреЛрдбрд╝реЗрдВред
рдпрд╛рдиреА рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд▓рд┐рдЦреЗрдВ:
var query = from customer in context.Customers select customer; //!  . query = query.OrderBy("name"); var data = query.ToList(); 

рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдкреЗрдбрд╝реЛрдВ рдХрд╛ рдЧрддрд┐рд╢реАрд▓ рдирд┐рд░реНрдорд╛рдг рдмрдЪрд╛рд╡ рдореЗрдВ рдЖрдПрдЧрд╛ред рд╕рдЪ рд╣реИ, рдЕрдХреЗрд▓реЗ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛрдЧреА, рдЖрдкрдХреЛ рдЯреЗрдореНрдкрд▓реЗрдЯ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдЦреЛрдЬрдиреЗ рдФрд░ рдирд┐рд░реНрдорд╛рдг рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рд▓реЗрдХрд┐рди рдпрд╣ рдЗрддрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИред рдиреАрдЪреЗ рд╡рд┐рд╡рд░рдгред


рдЬрдм рдлрд╝реАрд▓реНрдб рдирд╛рдо рд╕реНрдЯреНрд░рд┐рдВрдЧ рджреНрд╡рд╛рд░рд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЗрдХрд╛рдИ рдкреНрд░рд╢реНрдиреЛрдВ рдХреЗ рд▓рд┐рдП linq рдХреЛ рд╕реЙрд░реНрдЯ рдХрд░реЗрдВ


рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, Linq рдХреНрд╡реЗрд░реА рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдП рдЧрдП рдбреЗрдЯрд╛ рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА 4 рд╡рд┐рдзрд┐рдпрд╛рдБ рд╣реИрдВ:
 OrderBy OrderByDescending ThenBy ThenByDescending 

рд╣рдо рдПрдХ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рд╡рд┐рдзрд┐ рд▓рд┐рдЦреЗрдВрдЧреЗ рдЬрд┐рд╕рдореЗрдВ 3 рддрд░реНрдХ рд╣реЛрдВрдЧреЗред
 public static IOrderedQueryable<T> ApplyOrder<T>( this IQueryable<T> source, string property, string methodName ) 

рдХрд╣рд╛рдБ рд╕реНрд░реЛрдд рд╕реНрд░реЛрдд IQueriable рд╣реИ рдЬрд┐рд╕рд╕реЗ рдЖрдк рдСрд░реНрдбрд░ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ; рд╕рдВрдкрддреНрддрд┐ - рдЙрд╕ рд╕рдВрдкрддреНрддрд┐ рдХрд╛ рдирд╛рдо рдЬрд┐рд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рдЫрдБрдЯрд╛рдИ рдХреА рдЬрд╛рддреА рд╣реИ; MethodName - рдКрдкрд░ рдХреА рд╕реВрдЪреА рд╕реЗ рдЖрджреЗрд╢ рджреЗрдиреЗ рдХреА рд╡рд┐рдзрд┐ рдХрд╛ рдирд╛рдоред рдмреЗрд╢рдХ, рдпреБрджреНрдз рдХреЛрдб рдореЗрдВ, ApplyOrder рдХреЛ рдирд┐рдЬреА рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ:
 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) 

рдЬрд┐рд╕реЗ рддреБрдЪреНрдЫ рд░реВрдк рд╕реЗ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЕрдВрддрддрдГ ApplyOrder рдХрд╣рддреЗ рд╣реИрдВред
 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 }); } 

рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ рд╕рдордЭрд╛рддреА рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдЯреНрд░реА рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╕реЙрд░реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдлрд╝реАрд▓реНрдб рдПрдХреНрд╕реЗрд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдлрд┐рд░ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╡реГрдХреНрд╖ рд╕реЗ рдПрдХ рдореЗрдордирд╛ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЕрдЧрд▓рд╛, рдПрдХ рдЫрдБрдЯрд╛рдИ рд╡рд┐рдзрд┐ рдЬреЛ рд▓рдВрдмреЛрджрд░ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИ, рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдФрд░, рдЕрдВрдд рдореЗрдВ, рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЛ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдпрд╣рд╛рдВ рд╕рдмрд╕реЗ рдХрдард┐рди рдХреНрд╖рдг рдПрдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рд╡рд┐рдзрд┐ рдХрд╛ рдЧрддрд┐рд╢реАрд▓ рдирд┐рд░реНрдорд╛рдг рд╣реИ, рдЬрд┐рд╕реЗ рдПрдХ рдЕрд▓рдЧ рд╡рд┐рд╕реНрддрд╛рд░ рд╡рд┐рдзрд┐ GetGenericMethod рдореЗрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред
 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(); } 

рдпрд╣рд╛рдВ, рдирд╛рдо рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП, рдЯрд╛рдЗрдк рдХреНрд▓рд╛рд╕ рдмрдирд╛рдИ рдЧрдИ рд╣реИ, рдФрд░ 2 рдкреНрд░рдХрд╛рд░ рдХреА рд╕реВрдЪрд┐рдпрд╛рдВ рд╣реИрдВред GenericTypeArgs рд╕реВрдЪреА рдмрддрд╛рддреА рд╣реИ рдХрд┐ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рд╡рд┐рдзрд┐ рдмрдирд╛рдИ рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдП, рдФрд░ paramTypes рдЙрди рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреЛ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рд╕рдм рдУрд╡рд░рд▓реЛрдбрд┐рдВрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИ, рдХрднреА-рдХрднреА рдПрдХ рддрд░реАрдХрд╛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЗ рд╕рд╛рде рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рд╣рдореЗрдВ рд╕рд╣реА рдЪреБрдирдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЦреЛрдЬ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реА # рдЕрдзрд┐рднрд╛рд░ рд╕рдВрдХрд▓реНрдк рдХреЗ рдирд┐рдпрдореЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдирд╣реАрдВ рд╣реИ, рдпрд╣ рдХреЗрд╡рд▓ рдЗрд╕ рдмрд╛рдд рдкрд░ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддрд╛рдХрд┐ рдЖрдк рдкрд╛рд░рд┐рдд рдореВрд▓реНрдпреЛрдВ рдХреЛ рд╡рд┐рдзрд┐ рдХреЗ рддрд░реНрдХреЛрдВ рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд░ рд╕рдХреЗрдВред рдФрд░ рдлрд┐рд░, рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдирд╣реАрдВ, рд╕реЛрдЪ, рд╢рд░реНрддреЛрдВ рдХреЛ рд╕рдВрддреБрд╖реНрдЯ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдкрд╣рд▓рд╛ рдЕрдзрд┐рднрд╛рд░ рд▓рд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдПрдХ рд╡рд┐рд╢реЗрд╖ рд╡рд░реНрдЧ TestAssignable рджреНрд╡рд╛рд░рд╛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдореВрд▓реНрдп рдХреЛ рджреВрд╕рд░реЗ рдХреЛ рд╕реМрдВрдкрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдкрд░ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рддреБрд▓рдирд╛ред
 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(); 

рдиреНрдпреВрдирддрдо рд╕рдВрд╢реЛрдзрдиреЛрдВ рдХреЗ рд╕рд╛рде рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЗрдирдХ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП IEnumerable <> рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред


Source: https://habr.com/ru/post/In181065/


All Articles