linq表达式不区分大小写

我正在利用这个项目来使用jqgrid来过滤和排序集合 。 缺少一个function是这个例子不是我需要的不区分大小写的搜索。

因此,如果用户键入“Test”,我希望它与“TEST”,“TeST”等匹配。 。

我有这样的代码:

case WhereOperation.Equal: condition = Expression.Equal(memberAccessToString, filter); lambda = Expression.Lambda(condition, parameter); break; case WhereOperation.NotEqual: condition = Expression.NotEqual(memberAccessToString, filter); lambda = Expression.Lambda(condition, parameter); break; case WhereOperation.Contains: condition = Expression.Call(memberAccessToString, typeof(string).GetMethod("Contains"), Expression.Constant(value)); lambda = Expression.Lambda(condition, parameter); break; 

无论如何,下面的这些检查是不区分大小写的,所以“测试”将等于“测试”

 Expression.NotEqual Expression.Equal Expression.Call(memberAccessToString, typeof(string).GetMethod("Contains"), 

不幸的是,BCL没有Contains允许您指定大小写不变性的Contains重载。 您将必须获取IndexOf的正确重载作为解决方法(检查IndexOf的结果是否大于零):

 var methodInfo = typeof(string) .GetMethod("IndexOf", new[] { typeof(string), typeof(StringComparison) }); 

MethodInfo接受一个string和一个StringComparison ,如果您愿意,它允许您指定StringComparison.OrdinalIgnoreCase

在进行比较之前,您可以将两个值都转换为小写。 这是Contains的一个例子:

 case WhereOperation.Contains: var toLower = Expression.Call(memberAccessToString, typeof(string).GetMethod("ToLower", System.Type.EmptyTypes)); condition = Expression.Call(toLower, typeof(string).GetMethod("Contains"), Expression.Constant(value.ToString().ToLower())); lambda = Expression.Lambda(condition, parameter); break; 

但请注意,这不会通过土耳其测试 。

你得到以下方式:

First Extend字符串类:

 internal static class StringExtensions { public static bool ContainsExt(this String str, string val) { return str.IndexOf(val, StringComparison.InvariantCultureIgnoreCase) > -1 ? true : false; } } 

现在将Expression调用编写为

 Expression.Call(null, typeof(StringExtensions).GetMethod("ContainsExt", new Type[] { typeof(String), typeof(String) }), new[] { memberAccessToString, Expression.Constant(value)); 
 case WhereOperation.Contains: var callEx = Expression.Call(memberAccess, typeof(string).GetMethod("IndexOf", new[] { typeof(string), typeof(StringComparison) }), Expression.Constant(value), Expression.Constant(StringComparison.OrdinalIgnoreCase)); condition = Expression.NotEqual(callEx, Expression.Constant(-1)); lambda = Expression.Lambda(condition, parameter); break;