@@ -28,6 +28,8 @@ public static class IQueryableDynamicFilterExtensions
2828
2929 public static IQueryable < T > ToDynamic < T > ( this IQueryable < T > query , DynamicQuery dynamicQuery )
3030 {
31+ // Test
32+ Console . WriteLine ( dynamicQuery . Filter . Value ) ;
3133 if ( dynamicQuery . Filter is not null )
3234 query = Filter ( query , dynamicQuery . Filter ) ;
3335 if ( dynamicQuery . Sort is not null && dynamicQuery . Sort . Any ( ) )
@@ -38,10 +40,33 @@ public static IQueryable<T> ToDynamic<T>(this IQueryable<T> query, DynamicQuery
3840 private static IQueryable < T > Filter < T > ( IQueryable < T > queryable , Filter filter )
3941 {
4042 IList < Filter > filters = GetAllFilters ( filter ) ;
41- string ? [ ] values = filters . Select ( f => f . Value ) . ToArray ( ) ;
43+ var values = new List < object > ( ) ;
44+ foreach ( var f in filters )
45+ {
46+ if ( f . Operator == "in" )
47+ {
48+ Console . WriteLine ( f . Value ) ;
49+ var inValues = f . Value . Split ( ',' ) . Select ( v => v . Trim ( ) ) ;
50+ values . AddRange ( inValues ) ;
51+ }
52+ else if ( f . Operator == "between" )
53+ {
54+ var betweenValues = f . Value . Split ( ',' ) ;
55+ if ( betweenValues . Length != 2 )
56+ throw new ArgumentException ( "Invalid Value for 'between' operator" ) ;
57+
58+ values . AddRange ( betweenValues . Select ( v => v . Trim ( ) ) ) ;
59+ }
60+ else
61+ {
62+ values . Add ( f . Value ) ;
63+ }
64+ }
65+
4266 string where = Transform ( filter , filters ) ;
67+ Console . WriteLine ( where ) ;
4368 if ( ! string . IsNullOrEmpty ( where ) && values != null )
44- queryable = queryable . Where ( where , values ) ;
69+ queryable = queryable . Where ( where , values . ToArray ( ) ) ;
4570
4671 return queryable ;
4772 }
@@ -107,15 +132,30 @@ public static string Transform(Filter filter, IList<Filter> filters)
107132 }
108133 else if ( filter . Operator == "in" )
109134 {
110- where . Append ( $ "np({ filter . Field } ) in ({ filter . Value } )") ;
135+ var valueCount = filter . Value . Split ( ',' ) . Length ;
136+ var paramIndexes = Enumerable . Range ( index , valueCount )
137+ . Select ( i => $ "@{ i } ")
138+ . ToArray ( ) ;
139+
140+ if ( ! filter . CaseSensitive )
141+ {
142+ where . Append ( $ "np({ filter . Field } ).ToLower() in ({ string . Join ( "," , paramIndexes ) } )") ;
143+ }
144+ else
145+ {
146+ where . Append ( $ "np({ filter . Field } ) in ({ string . Join ( "," , paramIndexes ) } )") ;
147+ }
111148 }
112149 else if ( filter . Operator == "between" )
113150 {
114151 var values = filter . Value . Split ( ',' ) ;
115152 if ( values . Length != 2 )
116153 throw new ArgumentException ( "Invalid Value for 'between' operator" ) ;
117154
118- where . Append ( $ "(np({ filter . Field } ) >= { values [ 0 ] } and np({ filter . Field } ) <= { values [ 1 ] } )") ;
155+ var lowerBound = $ "@{ index ++ } ";
156+ var upperBound = $ "@{ index ++ } ";
157+
158+ where . Append ( $ "(np({ filter . Field } ) >= { lowerBound } and np({ filter . Field } ) <= { upperBound } )") ;
119159 }
120160 else
121161 where . Append ( $ "np({ filter . Field } ) { comparison } @{ index . ToString ( ) } ") ;
0 commit comments