使LINQ表达式不区分大小写

27 浏览
0 Comments

使LINQ表达式不区分大小写

我有以下的LINQ表达式,我需要将Contains设置为不区分大小写,尝试了不同的方法但都没有成功。\n

ParameterExpression paramExpr = Expression.Parameter(typeof(EmployeeEntity));
var propertyName = Expression.Property(paramExpr, "EmpName");
//开始进行类型转换
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);
//类型转换结束
MethodInfo method = typeof(string).GetMethod("Contains", new[] { typeof(string) });
var someValue = Expression.Constant(propertyValue, typeof(string));
var finalExpression = Expression.Call(propertyName, method, someValue);

\n在我的表中,EmpName是\'John\',但是上述查询将返回零行,所以如何使上述查询不区分大小写。

0
0 Comments

问题出现的原因:由于LINQ查询默认是区分大小写的,当需要进行大小写不敏感的查询时,就需要解决这个问题。

解决方法:有两种解决方法可以选择。

第一种方法是如果可以访问数据库并且数据库支持不同的排序规则(collations),那么最简单的解决方法是将字段的排序规则(collation)更改为不区分大小写的替代方案。可以使用以下代码更改表中字段的排序规则(collation)为不区分大小写:

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

第二种方法是根据评论中提到的,在属性和值中生成.ToLower()调用。这样可以将属性和值全部转换为小写,使得查询过程变为不区分大小写。

0
0 Comments

问题的出现的原因:在LINQ表达式中,需要进行大小写不敏感的比较,但是默认情况下,LINQ表达式是大小写敏感的。因此,需要找到一种方法来使LINQ表达式在进行比较时忽略大小写。

解决方法:通过使用StringComparison参数的Contains方法,可以实现在LINQ表达式中进行大小写不敏感的比较。可以使用反射来获取Contains方法,并将StringComparison参数设置为OrdinalIgnoreCase来忽略大小写。然后,可以使用Expression.Call方法来调用Contains方法,并传入属性值和StringComparison参数作为参数。这样就可以在LINQ表达式中实现大小写不敏感的比较。

示例代码如下:

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);

然而,需要注意的是,这种方法可能无法被EF(Entity Framework)翻译。因为在SQL中,没有一个标志可以实现大小写不敏感的比较。因此,这种方法可能会导致查询中的列和值被转换为相同的大小写,或者在比较之前从数据库中检索结果。但是,这种方法可以达到所需的结果。

通过使用MethodInfo和Expression.Call方法,可以在LINQ表达式中实现大小写不敏感的比较。但是需要注意,在某些情况下,这种方法可能无法被EF翻译。

0