提问人:Joe 提问时间:7/15/2023 更新时间:7/15/2023 访问量:34
SonarQube 问题:在 Linq 查询中添加 CultureInfo
SonarQube Issue: Adding CultureInfo inside Linq queries
问:
我正在我的 .net 核心应用程序上处理 SonarQube 问题。我对 sonarQube 报告有疑问,该报告要求在 LINQ 查询内的 ToString()、ToUpper()、ToLower() 等转换方法中添加文化信息。
查询示例:
var query = from emp in context.Employees
where emp.name.ToUpper() == name.ToUpper()
select emp;
如果我们添加,那么 Query 将中断并出现以下错误。在应用此条件之前,我不想将此查询转换为 AsEnumerable。name.ToUpper(new CultureInfo("en-US", false))
无法翻译。附加信息:方法“string”的翻译。ToUpper“失败。如果此方法可以映射到您的自定义函数
有人可以帮我解决这个问题吗?
答:
首先不要使用。这才是真正的哥兹拉大小的虫子。SonarQube抱怨蚊子坐在Godzila的右前指甲上,中间的指甲上。建议的解决方案是去拍它。emp.Name.ToUpper()
排序规则和区分大小写中介绍了 EF Core 和数据库中的区分大小写和排序规则,并明确警告不要使用 或:ToLower()
ToUpper()
通过 EF 在查询中覆盖区分大小写。Functions.Collate(或通过调用字符串。ToLower) 可能会对应用程序的性能产生非常重大的影响。
Using 可防止数据库使用涵盖此列的任何索引。这意味着,服务器现在必须扫描所有 100K 行,计算结果并将其与参数进行比较,而不是进行单个索引搜索来查找 100K 行表中的一行。ToUpper()
UPPER()
索引是根据实际列值创建的,使用其排序规则指定的列区分大小写规则。在 SQL Server 中,默认设置是使用区分大小写的排序规则。在其他数据库中,它通常区分大小写。
您可以强制查询使用不同的排序规则,但这仍会阻止服务器使用索引。在某些数据库中,可以创建具有不同排序规则的索引。在这两种情况下,服务器都会计算结果并将其存储在索引中。在其他数据库中,可以使用不区分大小写的排序规则基于原始数据库的内容创建计算列,并为其编制索引。必须更改查询以使用新的不区分大小写的列来利用索引EF.Functions.Collate
评论
emp.name.ToUpper()
emp.Name.ToUpper()
Name
ToUpper()
ToLower()
ToUpper()
Overriding case-sensitivity in a query via EF.Functions.Collate (or by calling string.ToLower) can have a very significant impact on your application's performance.