c# – 使用通用LINQ表达式为包含方法调用忽略大小写
发布时间:2020-12-16 01:56:13 所属栏目:百科 来源:网络整理
导读:我在下面的代码中使用Generic Filter,传递了任何搜索文本,但contains方法是区分大小写的,我怎样才能写入忽略大小写. public static class QueryExtensions{ public static IQueryableT FilterT(this IQueryableT query,string search) { var properties = ty
我在下面的代码中使用Generic Filter,传递了任何搜索文本,但contains方法是区分大小写的,我怎样才能写入忽略大小写.
public static class QueryExtensions { public static IQueryable<T> Filter<T>(this IQueryable<T> query,string search) { var properties = typeof(T).GetProperties().Where(p => /*p.GetCustomAttributes(typeof(System.Data.Objects.DataClasses.EdmScalarPropertyAttribute),true).Any() && */ p.PropertyType == typeof(String)); var predicate = PredicateBuilder.False<T>(); foreach (var property in properties ) { predicate = predicate.Or(CreateLike<T>(property,search)); } return query.AsExpandable().Where(predicate); } private static Expression<Func<T,bool>> CreateLike<T>( PropertyInfo prop,string value) { var parameter = Expression.Parameter(typeof(T),"f"); var propertyAccess = Expression.MakeMemberAccess(parameter,prop); var like = Expression.Call(propertyAccess,"Contains",null,Expression.Constant(value,typeof(string))); return Expression.Lambda<Func<T,bool>>(like,parameter); } } 解决方法
不要调用String.Contains,而是使用不区分大小写的
StringComparison参数调用
String.IndexOf.然后将其结果与0进行比较,使用
Expression.GreaterThanOrEqual表达式.您需要在Expression.Call中提供额外参数作为Expression.Constant.
您可以决定对其中一个不区分大小写的StringComparison选项进行硬编码,或将其作为Filter方法的参数导出,从而允许用户决定是否要求不区分大小写的搜索. 你可以这样做: private static Expression<Func<T,bool>> CreateLike<T>(PropertyInfo prop,string value) { var parameter = Expression.Parameter(typeof(T),prop); var indexOf = Expression.Call(propertyAccess,"IndexOf",typeof(string)),Expression.Constant(StringComparison.InvariantCultureIgnoreCase)); var like=Expression.GreaterThanOrEqual(indexOf,Expression.Constant(0)); return Expression.Lambda<Func<T,parameter); } 或者,使用StringComparison参数 private static Expression<Func<T,string value,StringComparison comparison=StringComparison.InvariantCultureIgnoreCase) { var parameter = Expression.Parameter(typeof(T),Expression.Constant(comparison)); var like=Expression.GreaterThanOrEqual(indexOf,parameter); } 通过使用默认值进行比较,可以避免为同一作业创建两个重载. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |