@@ -6,19 +6,40 @@ namespace Mvc.JQuery.Datatables
66{
77 static class TypeFilters
88 {
9- internal static string FilterMethod ( string q )
9+ internal static string FilterMethod ( string q , List < object > parametersForLinqQuery , Type type )
1010 {
11+ Func < string , string , string > makeClause = ( method , query ) =>
12+ {
13+ parametersForLinqQuery . Add ( Convert . ChangeType ( query , type ) ) ;
14+ var indexOfParameter = parametersForLinqQuery . Count - 1 ;
15+ return string . Format ( "{0}(@{1})" , method , indexOfParameter ) ;
16+ } ;
1117 if ( q . StartsWith ( "^" ) )
1218 {
13- return "ToLower().StartsWith(\" " + q . ToLower ( ) . Substring ( 1 ) . Replace ( "\" " , "\" \" " ) + "\" )" ;
19+ if ( q . EndsWith ( "$" ) )
20+ {
21+ parametersForLinqQuery . Add ( Convert . ChangeType ( q . Substring ( 1 , q . Length - 2 ) , type ) ) ;
22+ var indexOfParameter = parametersForLinqQuery . Count - 1 ;
23+ return string . Format ( "Equals((object)@{0})" , indexOfParameter ) ;
24+ }
25+ return makeClause ( "StartsWith" , q . Substring ( 1 ) ) ;
1426 }
1527 else
1628 {
17- return "ToLower().Contains(\" " + q . ToLower ( ) . Replace ( "\" " , "\" \" " ) + "\" )" ;
29+ if ( q . EndsWith ( "$" ) )
30+ {
31+ return makeClause ( "EndsWith" , q . Substring ( 0 , q . Length - 1 ) ) ;
32+ }
33+ return makeClause ( "Contains" , q ) ;
1834 }
1935 }
2036 public static string NumericFilter ( string query , string columnname , Type columnType , List < object > parametersForLinqQuery )
2137 {
38+ if ( query . StartsWith ( "^" ) ) query = query . TrimStart ( '^' ) ;
39+ if ( query . EndsWith ( "$" ) ) query = query . TrimEnd ( '$' ) ;
40+
41+ if ( query == "~" ) return string . Empty ;
42+
2243 if ( query . Contains ( "~" ) )
2344 {
2445 var parts = query . Split ( '~' ) ;
@@ -49,7 +70,7 @@ public static string NumericFilter(string query, string columnname, Type columnT
4970 try
5071 {
5172 parametersForLinqQuery . Add ( Convert . ChangeType ( query , columnType ) ) ;
52- return string . Format ( "{0} == @{1}" , columnname , parametersForLinqQuery . Count - 1 ) ;
73+ return string . Format ( "{0}.Equals( @{1}) " , columnname , parametersForLinqQuery . Count - 1 ) ;
5374 }
5475 catch ( FormatException )
5576 {
@@ -60,6 +81,8 @@ public static string NumericFilter(string query, string columnname, Type columnT
6081
6182 public static string DateTimeOffsetFilter ( string query , string columnname , Type columnType , List < object > parametersForLinqQuery )
6283 {
84+ if ( query == "~" ) return string . Empty ;
85+
6386 if ( query . Contains ( "~" ) )
6487 {
6588 var parts = query . Split ( '~' ) ;
@@ -73,11 +96,12 @@ public static string DateTimeOffsetFilter(string query, string columnname, Type
7396 }
7497 else
7598 {
76- return string . Format ( "{1}.ToLocalTime().ToString(\" g\" ).{0}" , FilterMethod ( query ) , columnname ) ;
99+ return string . Format ( "{1}.ToLocalTime().ToString(\" g\" ).{0}" , FilterMethod ( query , parametersForLinqQuery , columnType ) , columnname ) ;
77100 }
78101 }
79102 public static string DateTimeFilter ( string query , string columnname , Type columnType , List < object > parametersForLinqQuery )
80103 {
104+ if ( query == "~" ) return string . Empty ;
81105 if ( query . Contains ( "~" ) )
82106 {
83107 var parts = query . Split ( '~' ) ;
@@ -91,19 +115,47 @@ public static string DateTimeFilter(string query, string columnname, Type column
91115 }
92116 else
93117 {
94- return string . Format ( "{1}.ToLocalTime().ToString(\" g\" ).{0}" , FilterMethod ( query ) , columnname ) ;
118+ return string . Format ( "{1}.ToLocalTime().ToString(\" g\" ).{0}" , FilterMethod ( query , parametersForLinqQuery , columnType ) , columnname ) ;
95119 }
96120 }
121+ public static string BoolFilter ( string query , string columnname , Type columnType , List < object > parametersForLinqQuery )
122+ {
123+ if ( query != null )
124+ query = query . TrimStart ( '^' ) . TrimEnd ( '$' ) ;
125+ if ( string . IsNullOrWhiteSpace ( query ) ) return columnname + " == null" ;
126+ if ( query . ToLower ( ) == "true" ) return columnname + " == true" ;
127+ return columnname + " == false" ;
128+
129+ }
97130
98131 public static string StringFilter ( string q , string columnname , Type columntype , List < object > parametersforlinqquery )
99132 {
133+ if ( q == ".*" ) return "" ;
100134 if ( q . StartsWith ( "^" ) )
101135 {
102- return "(!string.IsNullOrEmpty(" + columnname + ") && " + columnname + ".ToLower().StartsWith(\" " + q . ToLower ( ) . Replace ( "\" " , "\" \" " ) + "\" ))" ;
136+ if ( q . EndsWith ( "$" ) )
137+ {
138+ parametersforlinqquery . Add ( q . Substring ( 1 , q . Length - 2 ) ) ;
139+ var parameterArg = "@" + ( parametersforlinqquery . Count - 1 ) ;
140+ return string . Format ( "{0} == {1}" , columnname , parameterArg ) ;
141+
142+ }
143+ else
144+ {
145+ parametersforlinqquery . Add ( q . Substring ( 1 ) ) ;
146+ var parameterArg = "@" + ( parametersforlinqquery . Count - 1 ) ;
147+ return string . Format ( "({0} != null && {0} != \" \" && ({0} == {1} || {0}.StartsWith({1})))" , columnname , parameterArg ) ;
148+ }
103149 }
104150 else
105151 {
106- return "(!string.IsNullOrEmpty(" + columnname + ") && " + columnname + ".ToLower().Contains(\" " + q . ToLower ( ) . Replace ( "\" " , "\" \" " ) + "\" ))" ;
152+ parametersforlinqquery . Add ( q ) ;
153+ var parameterArg = "@" + ( parametersforlinqquery . Count - 1 ) ;
154+ //return string.Format("{0} == {1}", columnname, parameterArg);
155+ return
156+ string . Format (
157+ "({0} != null && {0} != \" \" && ({0} == {1} || {0}.StartsWith({1}) || {0}.Contains({1})))" ,
158+ columnname , parameterArg ) ;
107159 }
108160 }
109161 }
0 commit comments