如何在ef core 2中包含不区分大小写的内容?

时间:2018-01-11 22:21:53

标签: c# sql entity-framework contains

我正在尝试通过searchstring过滤列表。 It says in the doc on the blue note那个:

  • IQueryable为您提供Contains的数据库提供程序实现。
  • IEnumarable为您提供Contains的
  • .NET Framework实现
  • SQL-server实例的默认设置不区分大小写。
  • 使用" ToUpper"应避免使用明确的不区分大小写的调用,因为它会降低性能。

我的过滤如下:

IQueryable<ApplicationUser> customers = from u in _context.Users
                        where (u.Customer != null && u.IsActive)
                        select u;

if (!String.IsNullOrEmpty(searchString))
{
            customers = customers.Where(s => s.Email.Contains(searchString));
}

然而,此解决方案区分大小写,我不明白为什么因为我使用IQueryable所以它应该使用默认情况下不区分大小写的数据库提供程序实现?我正在使用EF Core 2,目前只运行本地MSSQLLocalDB

3 个答案:

答案 0 :(得分:1)

最好使用LIKE运算符,例如

if (!String.IsNullOrEmpty(searchString))
{
            customers = customers.Where(x => EF.Functions.Like(x.Email, $"%{searchString}%"));
}

答案 1 :(得分:1)

从EF Core 2.1版开始,可以使用HasConversion()。但是数据库中的信息将以小写形式存储:

builder.Property(it => it.Email).HasConversion(v => v.ToLowerInvariant(), v => v);

我解决了类似的问题。这项更改解决了我所有的问题。

答案 2 :(得分:0)

StringComparison是我的答案。

customers = customer.where(s => s.Email.Contains(searchString,StringComparison.CurrentCultureIgnoreCase));

OR

customers = customer.where(s => s.Email.Contains(searchString,StringComparison.InvariantCultureIgnoreCase));

为我工作。