@@ -34,27 +34,27 @@ private class ComboExpressionVisitor(ParameterExpression parameter) : Expression
3434 /// </summary>
3535 /// <typeparam name="TItem"></typeparam>
3636 /// <param name="filter"></param>
37- /// <returns></returns >
38- public static Func < TItem , bool > GetFilterFunc < TItem > ( this FilterKeyValueAction filter ) => filter . GetFilterLambda < TItem > ( ) . Compile ( ) ;
37+ /// <param name="comparison"><see cref="StringComparison"/> 实例,此方法不支持 EFCore Where 查询</param >
38+ public static Func < TItem , bool > GetFilterFunc < TItem > ( this FilterKeyValueAction filter , StringComparison ? comparison = null ) => filter . GetFilterLambda < TItem > ( comparison ) . Compile ( ) ;
3939
4040 /// <summary>
4141 /// 指定 FilterKeyValueAction 获取 Lambda 表达式
4242 /// </summary>
4343 /// <typeparam name="TItem"></typeparam>
4444 /// <param name="filter"></param>
45- /// <returns></returns >
46- public static Expression < Func < TItem , bool > > GetFilterLambda < TItem > ( this FilterKeyValueAction filter )
45+ /// <param name="comparison"><see cref="StringComparison"/> 实例,此方法不支持 EFCore Where 查询</param >
46+ public static Expression < Func < TItem , bool > > GetFilterLambda < TItem > ( this FilterKeyValueAction filter , StringComparison ? comparison = null )
4747 {
4848 var express = new List < Expression < Func < TItem , bool > > > ( ) ;
4949 if ( filter . Filters . Count > 0 )
5050 {
5151 express . AddRange ( filter . Filters . Select ( f => f . Filters . Count > 0
52- ? f . Filters . GetFilterLambda < TItem > ( f . FilterLogic )
53- : f . GetInnerFilterLambda < TItem > ( ) ) ) ;
52+ ? f . Filters . GetFilterLambda < TItem > ( f . FilterLogic , comparison )
53+ : f . GetInnerFilterLambda < TItem > ( comparison ) ) ) ;
5454 }
5555 else
5656 {
57- express . Add ( filter . GetInnerFilterLambda < TItem > ( ) ) ;
57+ express . Add ( filter . GetInnerFilterLambda < TItem > ( comparison ) ) ;
5858 }
5959 return express . ExpressionAndLambda ( filter . FilterLogic ) ;
6060 }
@@ -83,12 +83,13 @@ public static Expression<Func<TItem, bool>> GetFilterLambda<TItem>(this FilterKe
8383 /// <typeparam name="TItem"></typeparam>
8484 /// <param name="filters"></param>
8585 /// <param name="logic"></param>
86+ /// <param name="comparison"><see cref="StringComparison"/> 实例</param>
8687 /// <returns></returns>
87- private static Expression < Func < TItem , bool > > GetFilterLambda < TItem > ( this IEnumerable < FilterKeyValueAction > filters , FilterLogic logic )
88+ private static Expression < Func < TItem , bool > > GetFilterLambda < TItem > ( this IEnumerable < FilterKeyValueAction > filters , FilterLogic logic , StringComparison ? comparison = null )
8889 {
8990 var express = filters . Select ( filter => filter . Filters . Count > 0
90- ? filter . Filters . GetFilterLambda < TItem > ( filter . FilterLogic )
91- : filter . GetInnerFilterLambda < TItem > ( ) )
91+ ? filter . Filters . GetFilterLambda < TItem > ( filter . FilterLogic , comparison )
92+ : filter . GetInnerFilterLambda < TItem > ( comparison ) )
9293 . ToList ( ) ;
9394 return express . ExpressionAndLambda ( logic ) ;
9495 }
@@ -126,13 +127,7 @@ private static Expression<Func<TItem, bool>> ExpressionAndLambda<TItem>(this IEn
126127 return ret ?? ( r => true ) ;
127128 }
128129
129- /// <summary>
130- /// 指定 FilterKeyValueAction 获取 Lambda 表达式
131- /// </summary>
132- /// <typeparam name="TItem"></typeparam>
133- /// <param name="filter"></param>
134- /// <returns></returns>
135- private static Expression < Func < TItem , bool > > GetInnerFilterLambda < TItem > ( this FilterKeyValueAction filter )
130+ private static Expression < Func < TItem , bool > > GetInnerFilterLambda < TItem > ( this FilterKeyValueAction filter , StringComparison ? comparison = null )
136131 {
137132 Expression < Func < TItem , bool > > ret = t => true ;
138133 var type = typeof ( TItem ) ;
@@ -148,7 +143,7 @@ Expression<Func<TItem, bool>> GetSimpleFilterExpression()
148143 var prop = typeof ( TItem ) . GetPropertyByName ( filter . FieldKey ) ?? throw new InvalidOperationException ( $ "the model { type . Name } not found the property { filter . FieldKey } ") ;
149144 var parameter = Expression . Parameter ( type ) ;
150145 var fieldExpression = Expression . Property ( parameter , prop ) ;
151- ret = filter . GetFilterExpression < TItem > ( prop , fieldExpression , parameter ) ;
146+ ret = filter . GetFilterExpression < TItem > ( prop , fieldExpression , parameter , comparison ) ;
152147 return ret ;
153148 }
154149
@@ -175,13 +170,13 @@ Expression<Func<TItem, bool>> GetComplexFilterExpression()
175170
176171 if ( fieldExpression != null )
177172 {
178- ret = filter . GetFilterExpression < TItem > ( prop , fieldExpression , parameter ) ;
173+ ret = filter . GetFilterExpression < TItem > ( prop , fieldExpression , parameter , comparison ) ;
179174 }
180175 return ret ;
181176 }
182177 }
183178
184- private static Expression < Func < TItem , bool > > GetFilterExpression < TItem > ( this FilterKeyValueAction filter , PropertyInfo ? prop , Expression fieldExpression , ParameterExpression parameter )
179+ private static Expression < Func < TItem , bool > > GetFilterExpression < TItem > ( this FilterKeyValueAction filter , PropertyInfo ? prop , Expression fieldExpression , ParameterExpression parameter , StringComparison ? comparison = null )
185180 {
186181 var isNullable = false ;
187182 var eq = fieldExpression ;
@@ -201,12 +196,12 @@ private static Expression<Func<TItem, bool>> GetFilterExpression<TItem>(this Fil
201196 }
202197 }
203198 eq = isNullable
204- ? Expression . AndAlso ( Expression . NotEqual ( fieldExpression , Expression . Constant ( null ) ) , filter . GetExpression ( eq ) )
205- : filter . GetExpression ( eq ) ;
199+ ? Expression . AndAlso ( Expression . NotEqual ( fieldExpression , Expression . Constant ( null ) ) , filter . GetExpression ( eq , comparison ) )
200+ : filter . GetExpression ( eq , comparison ) ;
206201 return Expression . Lambda < Func < TItem , bool > > ( eq , parameter ) ;
207202 }
208203
209- private static Expression GetExpression ( this FilterKeyValueAction filter , Expression left )
204+ private static Expression GetExpression ( this FilterKeyValueAction filter , Expression left , StringComparison ? comparison = null )
210205 {
211206 var right = Expression . Constant ( filter . FieldValue ) ;
212207 return filter . FilterAction switch
@@ -217,8 +212,8 @@ private static Expression GetExpression(this FilterKeyValueAction filter, Expres
217212 FilterAction . GreaterThanOrEqual => Expression . GreaterThanOrEqual ( left , right ) ,
218213 FilterAction . LessThan => Expression . LessThan ( left , right ) ,
219214 FilterAction . LessThanOrEqual => Expression . LessThanOrEqual ( left , right ) ,
220- FilterAction . Contains => left . Contains ( right ) ,
221- FilterAction . NotContains => Expression . Not ( left . Contains ( right ) ) ,
215+ FilterAction . Contains => left . Contains ( right , comparison ) ,
216+ FilterAction . NotContains => Expression . Not ( left . Contains ( right , comparison ) ) ,
222217 _ => filter . FieldValue switch
223218 {
224219 LambdaExpression t => Expression . Invoke ( t , left ) ,
@@ -228,12 +223,23 @@ private static Expression GetExpression(this FilterKeyValueAction filter, Expres
228223 } ;
229224 }
230225
231- private static BinaryExpression Contains ( this Expression left , Expression right )
226+ private static BinaryExpression Contains ( this Expression left , Expression right , StringComparison ? comparison ) => comparison . HasValue
227+ ? ContainsWidthComparison ( left , right , comparison . Value )
228+ : ContainsWithoutComparison ( left , right ) ;
229+
230+ private static BinaryExpression ContainsWithoutComparison ( this Expression left , Expression right )
232231 {
233232 var method = typeof ( string ) . GetMethod ( "Contains" , [ typeof ( string ) ] ) ! ;
234233 return Expression . AndAlso ( Expression . NotEqual ( left , Expression . Constant ( null ) ) , Expression . Call ( left , method , right ) ) ;
235234 }
236235
236+ private static BinaryExpression ContainsWidthComparison ( this Expression left , Expression right , StringComparison comparison )
237+ {
238+ var method = typeof ( string ) . GetMethod ( "Contains" , [ typeof ( string ) , typeof ( StringComparison ) ] ) ! ;
239+ var comparisonConstant = Expression . Constant ( comparison ) ;
240+ return Expression . AndAlso ( Expression . NotEqual ( left , Expression . Constant ( null ) ) , Expression . Call ( left , method , right , comparisonConstant ) ) ;
241+ }
242+
237243 #region Count
238244 /// <summary>
239245 /// Count 方法内部使用 Lambda 表达式做通用适配 可接受 IEnumerable 与 Array 子类
0 commit comments