рдкрд░рд┐рдЪрдп
Linq to Entity рдЖрдкрдХреЛ рд╕реНрдереИрддрд┐рдХ рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдБрдЪ рдХреЗ рд╕рд╛рде рдмрд╣реБрдд рд╣реА рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЬрдЯрд┐рд▓ рдкреНрд░рд╢реНрди рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдХрднреА-рдХрднреА рдЖрдкрдХреЛ рдкреНрд░рд╢реНрдиреЛрдВ рдХреЛ рдереЛрдбрд╝рд╛ рдФрд░ рдЧрддрд┐рд╢реАрд▓ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕реНрддрдВрдн рдирд╛рдо рд╕реНрдЯреНрд░рд┐рдВрдЧ рджреНрд╡рд╛рд░рд╛ рджрд┐рдП рдЬрд╛рдиреЗ рдкрд░ рдЫрдБрдЯрд╛рдИ рдЬреЛрдбрд╝реЗрдВред
рдпрд╛рдиреА рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд▓рд┐рдЦреЗрдВ:
var query = from customer in context.Customers select customer;
рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдкреЗрдбрд╝реЛрдВ рдХрд╛ рдЧрддрд┐рд╢реАрд▓ рдирд┐рд░реНрдорд╛рдг рдмрдЪрд╛рд╡ рдореЗрдВ рдЖрдПрдЧрд╛ред рд╕рдЪ рд╣реИ, рдЕрдХреЗрд▓реЗ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛрдЧреА, рдЖрдкрдХреЛ рдЯреЗрдореНрдкрд▓реЗрдЯ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдЦреЛрдЬрдиреЗ рдФрд░ рдирд┐рд░реНрдорд╛рдг рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рд▓реЗрдХрд┐рди рдпрд╣ рдЗрддрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИред рдиреАрдЪреЗ рд╡рд┐рд╡рд░рдгред
рдЬрдм рдлрд╝реАрд▓реНрдб рдирд╛рдо рд╕реНрдЯреНрд░рд┐рдВрдЧ рджреНрд╡рд╛рд░рд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЗрдХрд╛рдИ рдкреНрд░рд╢реНрдиреЛрдВ рдХреЗ рд▓рд┐рдП 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 ) {
рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ рд╕рдордЭрд╛рддреА рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдЯреНрд░реА рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╕реЙрд░реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдлрд╝реАрд▓реНрдб рдПрдХреНрд╕реЗрд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдлрд┐рд░ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╡реГрдХреНрд╖ рд╕реЗ рдПрдХ рдореЗрдордирд╛ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЕрдЧрд▓рд╛, рдПрдХ рдЫрдБрдЯрд╛рдИ рд╡рд┐рдзрд┐ рдЬреЛ рд▓рдВрдмреЛрджрд░ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИ, рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдФрд░, рдЕрдВрдд рдореЗрдВ, рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЛ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдпрд╣рд╛рдВ рд╕рдмрд╕реЗ рдХрдард┐рди рдХреНрд╖рдг рдПрдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рд╡рд┐рдзрд┐ рдХрд╛ рдЧрддрд┐рд╢реАрд▓ рдирд┐рд░реНрдорд╛рдг рд╣реИ, рдЬрд┐рд╕реЗ рдПрдХ рдЕрд▓рдЧ рд╡рд┐рд╕реНрддрд╛рд░ рд╡рд┐рдзрд┐ GetGenericMethod рдореЗрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред
public static MethodInfo GetGenericMethod( this Type type, string name, Type[] genericTypeArgs, Type[] paramTypes ) { var methods =
рдпрд╣рд╛рдВ, рдирд╛рдо рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП, рдЯрд╛рдЗрдк рдХреНрд▓рд╛рд╕ рдмрдирд╛рдИ рдЧрдИ рд╣реИ, рдФрд░ 2 рдкреНрд░рдХрд╛рд░ рдХреА рд╕реВрдЪрд┐рдпрд╛рдВ рд╣реИрдВред GenericTypeArgs рд╕реВрдЪреА рдмрддрд╛рддреА рд╣реИ рдХрд┐ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рд╡рд┐рдзрд┐ рдмрдирд╛рдИ рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдП, рдФрд░ paramTypes рдЙрди рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреЛ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рд╕рдм рдУрд╡рд░рд▓реЛрдбрд┐рдВрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИ, рдХрднреА-рдХрднреА рдПрдХ рддрд░реАрдХрд╛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЗ рд╕рд╛рде рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рд╣рдореЗрдВ рд╕рд╣реА рдЪреБрдирдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЦреЛрдЬ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реА # рдЕрдзрд┐рднрд╛рд░ рд╕рдВрдХрд▓реНрдк рдХреЗ рдирд┐рдпрдореЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдирд╣реАрдВ рд╣реИ, рдпрд╣ рдХреЗрд╡рд▓ рдЗрд╕ рдмрд╛рдд рдкрд░ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддрд╛рдХрд┐ рдЖрдк рдкрд╛рд░рд┐рдд рдореВрд▓реНрдпреЛрдВ рдХреЛ рд╡рд┐рдзрд┐ рдХреЗ рддрд░реНрдХреЛрдВ рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд░ рд╕рдХреЗрдВред рдФрд░ рдлрд┐рд░, рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдирд╣реАрдВ, рд╕реЛрдЪ, рд╢рд░реНрддреЛрдВ рдХреЛ рд╕рдВрддреБрд╖реНрдЯ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдкрд╣рд▓рд╛ рдЕрдзрд┐рднрд╛рд░ рд▓рд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдПрдХ рд╡рд┐рд╢реЗрд╖ рд╡рд░реНрдЧ TestAssignable рджреНрд╡рд╛рд░рд╛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдореВрд▓реНрдп рдХреЛ рджреВрд╕рд░реЗ рдХреЛ рд╕реМрдВрдкрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдкрд░ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рддреБрд▓рдирд╛ред
private class TestAssignable : IEqualityComparer<Type> { public bool Equals(Type x, Type y) {
рдиреНрдпреВрдирддрдо рд╕рдВрд╢реЛрдзрдиреЛрдВ рдХреЗ рд╕рд╛рде рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЗрдирдХ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП IEnumerable <> рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред