EF Core中SQL转换的规则尚不清楚,远未完善,尚在讨论中,并且随着每个次要发行版的发布而不断变化。
的翻译
StartsWith,
EndsWith并
Contains进行了讨论,并改了好几次-
例如,问题#474:查询:提高字符串的StartsWith,的endsWith的翻译和包含)。的翻译
StartsWith已经在最新的官方版本V1.1.2甚至被改变,所以V1.1.1翻译
(CHARINDEX(@__name_0, [u0].[Name]) = 1)) OR (@__name_0 = N''))
现在将像
[u0].[Name] LIKE @__name_0 + '%' AND (CHARINDEX(@__name_0, [u0].[Name]) = 1)) OR (@__name_0 = N''))
这个想法是
LIKE有条件的,允许查询优化器使用索引,然后像以前一样对第二个条件进行慢速过滤(这是关于正确处理(类似于C#)搜索字符串以及空搜索字符串中的通配符的全部内容)。
因此,您可以尝试升级,看看是否有帮助。即将发布的v2将为诸如db等特定于db的运算符提供更自然的支持
LIKE。
当前的另一个解决方法(如果以上确实是性能瓶颈)是直接使用SQL构建查询过滤部分,而使用LINQ直接构建其余部分(与EF6相反,EF Core允许这样做):
var results = await db.ApplicationUsers //.Where(u => u.Name.StartsWith(name) && !u.Deleted && u.AppearInSearch) .FromSql("select * from ApplicationUsers where Name like {0}", name + "%") .Where(!u.Deleted && u.AppearInSearch) .OrderByDescending(u => u.Verified) .ThenBy(u => u.DateAdded) // Added to prevent duplication of results in different pages .Skip(page * recordsInPage) .Take(recordsInPage) .Select(u => new UserSearchResult() { Name = u.Name, Verified = u.Verified, PhotoURL = u.PhotoURL, UserID = u.Id, Subdomain = u.Subdomain }).ToListAsync();
请注意,该
FromSql方法支持参数,因此不要担心SQL注入。仍然需要了解表名,列名和具体的数据库SQL语法-ORM应该为您抽象一些内容。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)