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;