使 LINQ 表达式不区分大小写

Make LINQ expression case insensitive

我有以下 LINQ 表达式,我需要使 Contains 不区分大小写,尝试了不同的方法,但其中 none 有效

ParameterExpression paramExpr = Expression.Parameter(typeof(EmployeeEntity));
var propertyName = Expression.Property(paramExpr, "EmpName");
//for type convertion start
var propertyType = ((PropertyInfo)propertyName.Member).PropertyType;
var converter = TypeDescriptor.GetConverter(propertyType); 
if (!converter.CanConvertFrom(typeof(string))) 
    throw new NotSupportedException();
var propertyValue = converter.ConvertFromInvariantString("john"); 
var constant = Expression.Constant(propertyValue);
var valueExpression = Expression.Convert(constant, propertyType);
//for type convertion ends

MethodInfo method = typeof(string).GetMethod("Contains", new[] { typeof(string) });
var someValue = Expression.Constant(propertyValue, typeof(string));
var finalExpression = Expression.Call(propertyName, method, someValue);

在我的 Table 中 EmpName 是 'John' 但是我上面的查询将 return 零行,所以如何使上面的查询不区分大小写。

如果您可以访问您的数据库并且它支持不同的排序规则(例如 MS SQL),那么解决该问题的最简单方法是将字段的排序规则更改为不区分大小写的替代方案:

ALTER TABLE [MyTable]
  ALTER COLUMN [MyColumn] NVARCHAR(...) COLLATE Latin1_General_CI_AS 

否则,如评论中所述,您可以生成 .ToLower() 对属性和值的调用。

这样可以吗?它应该使用 StringComparison 参数获取 Contains 方法并传入值以忽略大小写。

MethodInfo method = typeof(string).GetMethod("Contains", new[] { typeof(string), typeof(StringComparison) });
var someValue = Expression.Constant(propertyValue, typeof(string));
var comparisonValue = Expression.Constant(StringComparison.OrdinalIgnoreCase, typeof(StringComparison));
var finalExpression = Expression.Call(propertyName, method, someValue, comparisonValue);