leo*_*ora 12 c# linq comparison expression
我正在利用这个项目来使用jqgrid来过滤和排序集合.缺少一个功能是这个例子不是我需要的不区分大小写的搜索.
因此,如果用户键入"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;
Run Code Online (Sandbox Code Playgroud)
无论如何,下面的这些检查是不区分大小写的,所以"测试"将等于"测试"
Expression.NotEqual
Expression.Equal
Expression.Call(memberAccessToString,
typeof(string).GetMethod("Contains"),
Run Code Online (Sandbox Code Playgroud)
Hei*_*nzi 18
在进行比较之前,您可以将两个值都转换为小写.这是一个例子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;
Run Code Online (Sandbox Code Playgroud)
但请注意,这不会通过土耳其测试.
不幸的是,BCL没有Contains
允许您指定大小写不变性的重载.您必须获取正确的重载IndexOf
作为解决方法(检查结果IndexOf
是否大于零):
var methodInfo
= typeof(string)
.GetMethod("IndexOf",
new[] { typeof(string), typeof(StringComparison) });
Run Code Online (Sandbox Code Playgroud)
这MethodInfo
接受a string
和a StringComparison
,这将允许您指定StringComparison.OrdinalIgnoreCase
是否愿意.