【发布时间】:2018-06-21 08:31:34
【问题描述】:
我正在尝试通过搜索字符串过滤列表。上面写着in the doc on the blue note:
- IQueryable 为您提供
Contains的数据库提供程序实现。 -
IEnumerable为您提供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。
【问题讨论】:
-
您可以使用 String.ToLower() 对它们进行均衡化,然后比较这些临时字符串。您可能还想在其上运行 String.Normalize(),只是为了避免 Unicode 不一致。请注意,在循环中创建这么多字符串可能会产生大量的处理、内存和 GC 负载。字符串是最奇怪的类 请参阅这篇关于一般比较相等性的文章:codeproject.com/Articles/18714/…
-
是的,调用 ToLower() 或 Normalize() 将具有与 ToUpper() 完全相同的性能开销,就像我在第 4 个要点中提到的那样。我希望避免这种情况,最好的解决方案可能就是更改我的数据库中的排序规则设置
-
@JasonReddekopp 关于 .Net 中
string处理的问题与 LINQ to SQL 查询关系不大。 -
String.Contains 区分大小写,因此该部分是预期的。如果您跳过该部分,数据库不会将上下文中的所有用户还给您吗?
标签: c# sql entity-framework entity-framework-core contains