@@ -8,57 +8,6 @@ namespace OpenShock.Common.Extensions;
88
99public static class IQueryableExtensions
1010{
11- private static MethodInfo [ ] PublicQueryableMethods => typeof ( Queryable ) . GetMethods ( BindingFlags . Static | BindingFlags . Public ) ;
12- private static readonly MethodInfo OrderByAscendingMethodInfo = PublicQueryableMethods . Single ( m => m . Name == "OrderBy" && m . GetParameters ( ) . Length == 2 ) ;
13- private static readonly MethodInfo OrderByDescendingMethodInfo = PublicQueryableMethods . Single ( m => m . Name == "OrderByDescending" && m . GetParameters ( ) . Length == 2 ) ;
14- private static readonly MethodInfo OrderThenByAscendingMethodInfo = PublicQueryableMethods . Single ( m => m . Name == "ThenBy" && m . GetParameters ( ) . Length == 2 ) ;
15- private static readonly MethodInfo OrderThenByDescendingMethodInfo = PublicQueryableMethods . Single ( m => m . Name == "ThenByDescending" && m . GetParameters ( ) . Length == 2 ) ;
16-
17- private record struct OrderByItem ( string Name , bool Descending ) ;
18-
19- private static OrderByItem ParseOrderByPart ( string str )
20- {
21- var parts = str . Split ( ' ' ) ;
22- if ( parts . Length == 1 )
23- {
24- return new OrderByItem ( str , false ) ;
25- }
26-
27- if ( parts . Length == 2 )
28- {
29- bool descending = parts [ 1 ] . ToLower ( ) switch
30- {
31- "asc" => false ,
32- "desc" => true ,
33- _ => throw new InvalidOperationException ( "Direction if specified must be 'asc' or 'desc'." ) ,
34- } ;
35-
36- return new OrderByItem ( parts [ 0 ] , descending ) ;
37- }
38-
39- throw new InvalidOperationException ( "Invalid orderby query." ) ;
40- }
41-
42- private static IOrderedQueryable < T > OrderBy < T > ( this IQueryable < T > source , LambdaExpression keySelector , bool descending = false )
43- {
44- var method = ( descending ? OrderByDescendingMethodInfo : OrderByAscendingMethodInfo )
45- . MakeGenericMethod ( typeof ( T ) , keySelector . Body . Type ) ;
46-
47- var call = Expression . Call ( null , method , source . Expression , Expression . Quote ( keySelector ) ) ;
48-
49- return ( IOrderedQueryable < T > ) source . Provider . CreateQuery ( call ) ;
50- }
51-
52- private static IOrderedQueryable < T > ThenBy < T > ( this IOrderedQueryable < T > source , LambdaExpression keySelector , bool descending = false )
53- {
54- var method = ( descending ? OrderThenByDescendingMethodInfo : OrderThenByAscendingMethodInfo )
55- . MakeGenericMethod ( typeof ( T ) , keySelector . Body . Type ) ;
56-
57- var call = Expression . Call ( null , method , source . Expression , Expression . Quote ( keySelector ) ) ;
58-
59- return ( IOrderedQueryable < T > ) source . Provider . CreateQuery ( call ) ;
60- }
61-
6211 public static IQueryable < TEntity > WhereUserIdMatches < TEntity > ( this IQueryable < TEntity > source , Expression < Func < TEntity , User > > userNavigation , Guid userId )
6312 {
6413 var userIdConstant = Expression . Constant ( userId ) ;
@@ -88,21 +37,10 @@ public static IQueryable<T> ApplyFilter<T>(this IQueryable<T> query, string filt
8837 return query . Where ( DBExpressionBuilder . GetFilterExpression < T > ( filterQuery ) ) ;
8938 }
9039
91- public static IOrderedQueryable < T > ApplyOrderBy < T > ( this IQueryable < T > query , string orderbyQuery ) where T : class
40+ public static IOrderedQueryable < T > ApplyOrderBy < T > ( IQueryable < T > query , string orderbyQuery ) where T : class
9241 {
9342 ArgumentException . ThrowIfNullOrWhiteSpace ( orderbyQuery , nameof ( orderbyQuery ) ) ;
9443
95- var parts = orderbyQuery . Split ( ',' ) ;
96-
97- var parsed = ParseOrderByPart ( parts [ 0 ] ) ;
98- var orderedQuery = query . OrderBy ( DBExpressionBuilderUtils . CreatePropertyOrFieldAccessorExpression < T > ( parsed . Name ) , parsed . Descending ) ;
99-
100- for ( int i = 1 ; i < parts . Length ; ++ i )
101- {
102- parsed = ParseOrderByPart ( parts [ i ] ) ;
103- orderedQuery = orderedQuery . ThenBy ( DBExpressionBuilderUtils . CreatePropertyOrFieldAccessorExpression < T > ( parsed . Name ) , parsed . Descending ) ;
104- }
105-
106- return orderedQuery ;
44+ return OrderByQueryBuilder . ApplyOrderBy ( query , orderbyQuery ) ;
10745 }
10846}
0 commit comments