LINQ中StartsWith()不会转换为Like('abc%')

LINQ中StartsWith()不会转换为Like('abc%'),第1张

LINQ中StartsWith()不会转换为Like('abc%')

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应该为您抽象一些内容。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5144954.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-17
下一篇 2022-11-18

发表评论

登录后才能评论

评论列表(0条)

保存