@@ -59,23 +59,25 @@ public IQueryable FilterPagingSortingSearch(DataTablesParam dtParameters, IQuery
5959 return data ;
6060 }
6161
62- public delegate string ReturnedFilteredQueryForType ( string query , string columnName , Type columnType , List < object > parametersForLinqQuery ) ;
62+ public delegate string ReturnedFilteredQueryForType (
63+ string query , string columnName , Type columnType , List < object > parametersForLinqQuery ) ;
6364
6465
65-
66- static readonly List < ReturnedFilteredQueryForType > Filters = new List < ReturnedFilteredQueryForType > ( )
66+ private static readonly List < ReturnedFilteredQueryForType > Filters = new List < ReturnedFilteredQueryForType > ( )
6767 {
6868 Guard ( IsBoolType , TypeFilters . BoolFilter ) ,
6969 Guard ( IsDateTimeType , TypeFilters . DateTimeFilter ) ,
7070 Guard ( IsDateTimeOffsetType , TypeFilters . DateTimeOffsetFilter ) ,
7171 Guard ( IsNumericType , TypeFilters . NumericFilter ) ,
72+ Guard ( IsEnumType , TypeFilters . EnumFilter ) ,
7273 Guard ( arg => arg == typeof ( string ) , TypeFilters . StringFilter ) ,
7374 } ;
7475
7576
76- public delegate string GuardedFilter ( string query , string columnName , Type columnType , List < object > parametersForLinqQuery ) ;
77+ public delegate string GuardedFilter (
78+ string query , string columnName , Type columnType , List < object > parametersForLinqQuery ) ;
7779
78- static ReturnedFilteredQueryForType Guard ( Func < Type , bool > guard , GuardedFilter filter )
80+ private static ReturnedFilteredQueryForType Guard ( Func < Type , bool > guard , GuardedFilter filter )
7981 {
8082 return ( q , c , t , p ) =>
8183 {
@@ -94,19 +96,20 @@ public static void RegisterFilter<T>(GuardedFilter filter)
9496
9597 private static string GetFilterClause ( string query , ColInfo column , List < object > parametersForLinqQuery )
9698 {
97- foreach ( var filter in Filters )
99+ Func < string , string > filterClause = ( queryPart ) =>
100+ Filters . Select (
101+ f => f ( queryPart , column . Name , column . Type , parametersForLinqQuery ) )
102+ . First ( filterPart => filterPart != null ) ;
103+
104+ var queryParts = query . Split ( '|' ) . Select ( filterClause ) . Where ( fc => fc != "" ) . ToArray ( ) ;
105+ if ( queryParts . Any ( ) )
98106 {
99- var filteredQuery = filter ( query , column . Name , column . Type , parametersForLinqQuery ) ;
100- if ( filteredQuery != null )
101- {
102- return filteredQuery ;
103- }
107+ return "(" + string . Join ( ") OR (" , queryParts ) + ")" ;
104108 }
105- var parts = query . Split ( '~' ) . SelectMany ( s => s . Split ( '|' ) )
106- . Select ( q => string . Format ( "({1} == null ? \" \" : {1}.ToString()).{0}" , TypeFilters . FilterMethod ( q , parametersForLinqQuery , column . Type ) , column . Name ) ) ;
107- return "(" + string . Join ( ") OR (" , parts ) + ")" ;
109+ return null ;
108110 }
109111
112+
110113 public static bool IsNumericType ( Type type )
111114 {
112115 if ( type == null || type . IsEnum )
@@ -138,6 +141,11 @@ public static bool IsNumericType(Type type)
138141 return false ;
139142
140143 }
144+ public static bool IsEnumType ( Type type )
145+ {
146+ return type . IsEnum ;
147+ }
148+
141149 public static bool IsBoolType ( Type type )
142150 {
143151 return type == typeof ( bool ) || type == typeof ( bool ? ) ;
@@ -148,7 +156,7 @@ public static bool IsDateTimeType(Type type)
148156 }
149157 public static bool IsDateTimeOffsetType ( Type type )
150158 {
151- return type == typeof ( DateTimeOffset ) || type == typeof ( DateTimeOffset ? ) ;
159+ return type == typeof ( DateTimeOffset ) || type == typeof ( DateTimeOffset ? ) ;
152160 }
153161
154162 }
0 commit comments