@@ -7,7 +7,7 @@ namespace Mvc.JQuery.Datatables
77{
88 public class DataTablesFilter
99 {
10- public IQueryable FilterPagingSortingSearch ( DataTablesParam dtParameters , IQueryable data , Tuple < string , string , Type > [ ] columns )
10+ public IQueryable FilterPagingSortingSearch ( DataTablesParam dtParameters , IQueryable data , ColInfo [ ] columns )
1111 {
1212 if ( ! String . IsNullOrEmpty ( dtParameters . sSearch ) )
1313 {
@@ -40,96 +40,33 @@ public IQueryable FilterPagingSortingSearch(DataTablesParam dtParameters, IQuery
4040 {
4141
4242 int columnNumber = dtParameters . iSortCol [ i ] ;
43- string columnName = columns [ columnNumber ] . Item1 ;
43+ string columnName = columns [ columnNumber ] . Name ;
4444 string sortDir = dtParameters . sSortDir [ i ] ;
4545 if ( i != 0 )
4646 sortString += ", " ;
4747 sortString += columnName + " " + sortDir ;
4848 }
49-
49+ if ( string . IsNullOrWhiteSpace ( sortString ) )
50+ {
51+ sortString = columns [ 0 ] . Name ;
52+ }
5053 data = data . OrderBy ( sortString ) ;
51-
54+
5255
5356 return data ;
5457 }
5558
5659 public delegate string ReturnedFilteredQueryForType ( string query , string columnName , Type columnType , List < object > parametersForLinqQuery ) ;
5760
58- static string FilterMethod ( string q )
59- {
60- if ( q . StartsWith ( "^" ) )
61- {
62- return "ToLower().StartsWith(\" " + q . ToLower ( ) . Substring ( 1 ) . Replace ( "\" " , "\" \" " ) + "\" )" ;
63- }
64- else
65- {
66- return "ToLower().Contains(\" " + q . ToLower ( ) . Replace ( "\" " , "\" \" " ) + "\" )" ;
67- }
68- }
61+
6962
7063 static readonly List < ReturnedFilteredQueryForType > Filters = new List < ReturnedFilteredQueryForType > ( )
7164 {
72- Guard ( IsDateType , DateFilter ) ,
73- Guard ( IsNumericType , NumericFilter )
74-
65+ Guard ( IsDateType , TypeFilters . DateFilter ) ,
66+ Guard ( IsNumericType , TypeFilters . NumericFilter ) ,
67+ Guard ( arg => arg == typeof ( string ) , TypeFilters . StringFilter ) ,
7568 } ;
7669
77- private static bool Is < T > ( Type arg )
78- {
79- return arg is T ;
80- }
81-
82- private static string NumericFilter ( string query , string columnname , Type columnType , List < object > parametersForLinqQuery )
83- {
84- if ( query . Contains ( "~" ) )
85- {
86- var parts = query . Split ( '~' ) ;
87- var clause = null as string ;
88- try
89- {
90- parametersForLinqQuery . Add ( Convert . ChangeType ( parts [ 0 ] , columnType ) ) ;
91- clause = string . Format ( "{0} >= @{1}" , columnname , parametersForLinqQuery . Count - 1 ) ;
92- }
93- catch ( FormatException )
94- {
95- }
96-
97- try
98- {
99- parametersForLinqQuery . Add ( Convert . ChangeType ( parts [ 1 ] , columnType ) ) ;
100- if ( clause != null ) clause += " and " ;
101- clause += string . Format ( "{0} <= @{1}" , columnname , parametersForLinqQuery . Count - 1 ) ;
102- }
103- catch ( FormatException )
104- {
105- }
106- return clause ?? "true" ;
107-
108- }
109- else
110- {
111- return string . Format ( "({1} == null ? \" \" : {1}.ToString()).{0}" , FilterMethod ( query ) , columnname ) ;
112- }
113- }
114-
115- private static string DateFilter ( string query , string columnname , Type columnType , List < object > parametersForLinqQuery )
116- {
117- if ( query . Contains ( "~" ) )
118- {
119- var parts = query . Split ( '~' ) ;
120- DateTimeOffset start , end ;
121- DateTimeOffset . TryParse ( parts [ 0 ] ?? "" , out start ) ;
122- if ( ! DateTimeOffset . TryParse ( parts [ 1 ] ?? "" , out end ) ) end = DateTimeOffset . MaxValue ;
123-
124- parametersForLinqQuery . Add ( start ) ;
125- parametersForLinqQuery . Add ( end ) ;
126- return string . Format ( "{0}.Ticks >= @{1}.Ticks and {0}.Ticks <= @{2}.Ticks" , columnname , parametersForLinqQuery . Count - 2 , parametersForLinqQuery . Count - 1 ) ;
127- }
128- else
129- {
130- return string . Format ( "{1}.ToLocalTime().ToString(\" g\" ).{0}" , FilterMethod ( query ) , columnname ) ;
131- }
132- }
13370
13471 public delegate string GuardedFilter ( string query , string columnName , Type columnType , List < object > parametersForLinqQuery ) ;
13572
@@ -147,20 +84,21 @@ static ReturnedFilteredQueryForType Guard(Func<Type, bool> guard, GuardedFilter
14784
14885 public static void RegisterFilter < T > ( GuardedFilter filter )
14986 {
150- Filters . Add ( Guard ( Is < T > , filter ) ) ;
87+ Filters . Add ( Guard ( arg => arg is T , filter ) ) ;
15188 }
15289
153- private static string GetFilterClause ( string query , Tuple < string , string , Type > column , List < object > parametersForLinqQuery )
90+ private static string GetFilterClause ( string query , ColInfo column , List < object > parametersForLinqQuery )
15491 {
15592 foreach ( var filter in Filters )
15693 {
157- var filteredQuery = filter ( query , column . Item1 , column . Item3 , parametersForLinqQuery ) ;
94+ var filteredQuery = filter ( query , column . Name , column . Type , parametersForLinqQuery ) ;
15895 if ( filteredQuery != null )
15996 {
16097 return filteredQuery ;
16198 }
16299 }
163- var parts = query . Split ( '~' ) . SelectMany ( s => s . Split ( '|' ) ) . Select ( q => string . Format ( "({1} == null ? \" \" : {1}.ToString()).{0}" , FilterMethod ( q ) , column . Item1 ) ) ;
100+ var parts = query . Split ( '~' ) . SelectMany ( s => s . Split ( '|' ) )
101+ . Select ( q => string . Format ( "({1} == null ? \" \" : {1}.ToString()).{0}" , TypeFilters . FilterMethod ( q ) , column . Name ) ) ;
164102 return "(" + string . Join ( ") OR (" , parts ) + ")" ;
165103 }
166104
0 commit comments