LINQ Contains Case Insensitive

33 浏览
0 Comments

LINQ Contains Case Insensitive

这段代码是区分大小写的,如何使其不区分大小写? \n

public IQueryable GetFacilityItemRootByDescription(string description)
{
    return this.ObjectContext.FACILITY_ITEM.Where(fi => fi.DESCRIPTION.ToLower().Contains(description.ToLower()));
}

0
0 Comments

问题出现的原因是在LINQ to Entities中,使用IndexOf()进行大小写不敏感的字符串匹配并不起作用。然而,在LINQ to Objects中,这种方法是有效的。

解决方法是使用SqlFunctions类中的StringConvert方法,通过将字符串转换为大写或小写来进行比较。这样可以在LINQ to Entities中实现大小写不敏感的字符串匹配。

下面是使用SqlFunctions.StringConvert方法解决问题的代码示例:

public IQueryable<FACILITY_ITEM> GetFacilityItemRootByDescription(string description)
{
    return this.ObjectContext.FACILITY_ITEM
        .Where(fi => SqlFunctions.StringConvert(fi.DESCRIPTION)
                       .ToUpper()
                       .Contains(description.ToUpper()));
}

这样,我们就可以在LINQ to Entities中实现大小写不敏感的字符串匹配了。

需要注意的是,如果一个字符串是另一个字符串的子串,使用IndexOf()方法可能会导致问题。例如,如果我们有一个字符串列表{"ora","orange","ora2"},使用IndexOf()方法来搜索"ora"时,会将"ora2"也作为匹配项返回。因此,在使用Contains()方法之前,需要仔细考虑字符串匹配的逻辑。

0
0 Comments

LINQ Contains Case Insensitive问题的出现原因是LINQ查询的执行环境不同。如果LINQ查询在数据库上下文中执行,则对Contains()的调用将被映射为LIKE运算符:.Where(a => a.Field.Contains("hello"))将被映射为Field LIKE '%hello%'。默认情况下,LIKE运算符是不区分大小写的,但是可以通过更改列的排序规则来改变这一点。

如果LINQ查询在.NET上下文中执行,则可以使用IndexOf()方法,但此方法在LINQ to SQL中不受支持。

LINQ to SQL不支持接受CultureInfo参数的方法,可能是因为它不能保证SQL服务器处理文化与.NET相同。但实际上,它支持StartsWith(string, StringComparison)方法。然而,它似乎不支持在LINQ to SQL中评估为LIKE的方法,并且在.NET中进行不区分大小写的比较,这使得无法以一致的方式进行不区分大小写的Contains()操作。

EF 4.3不支持StartsWith。我得到了错误信息:LINQ to Entities does not recognize the method 'Boolean StartsWith(System.String, System.StringComparison)'。

clicdata链接已失效。

对于使用EF的情况,一个选项是在一个上下文中需要进行不区分大小写搜索,而另一个上下文中需要进行区分大小写搜索。是否仅需承受性能损耗并使用'toLower()'方法?

当我使用toLower()时,我得到了一个"couldn't be translated"的错误。

0
0 Comments

LINQ Contains Case Insensitive问题的出现原因是在比较字符串是否包含某个子串时,使用了ToLower()方法将两个字符串都转为小写,然后再进行比较。这种方法虽然逻辑上可行,但不满足Turkey Test,即在处理特定字符集时可能会出现问题。此外,使用ToLower()方法会重复执行转换操作,效率较低。

为了解决这个问题,可以使用StringComparer.CurrentCultureIgnoreCase属性来处理字符串的比较。具体的解决方法是将.Contains(description.ToLower())替换为.Contains(description, StringComparer.CurrentCultureIgnoreCase)。这样就能实现大小写不敏感的字符串包含判断。

除了使用StringComparer.CurrentCultureIgnoreCase属性,还可以使用IndexOf方法来进行字符串的包含判断。具体的解决方法是使用.Where(fi => fi.DESCRIPTION.IndexOf(description, StringComparison.OrdinalIgnoreCase) >= 0)。这种方法可能更快,但在LINQ to SQL中可能无法转换为SQL查询。

另外,为了提高效率,可以先将description转为小写,并存储在一个变量中,然后在查询中使用该变量,避免重复执行ToLower()操作。

针对LINQ Contains Case Insensitive问题,可以使用StringComparer.CurrentCultureIgnoreCase属性或IndexOf方法来实现大小写不敏感的字符串包含判断,从而解决问题。这些方法不仅能提高效率,还能避免在处理特定字符集时出现问题。

0