LINQ EF Core 3.0中的重大更改。如何在不收到警告CA1308的情况下比较字符串?

时间:2019-11-25 10:13:09

标签: .net-core .net-core-3.0 ef-core-3.0 entity-framework-core-3.0

我有以下代码,该代码在EF Core 2.1上运行良好:

.FirstOrDefault(a => (a.Name.Equals(b, StringComparison.InvariantCultureIgnoreCase)

(好的,运行良好意味着即使在客户端对它进行评估,但我不知道,我还是得到了正确的结果。)

我升级到EF Core 3.0,但没有收到任何错误,但是此代码未提供预期的结果。

我看到了here的解决方案。我尝试过a.Name.ToLower() == b.ToLower(),但后来得到了the error

Error CA1304 The behavior of 'string.ToLower()' could vary based on the current user's locale settings. Replace this call in 'MyFunction(string, string)' with a call to 'string.ToLower(CultureInfo)'

如果我使用ToLower(CultureInfo.InvariantCulture),则会收到消息:

Error CA1308 In method 'MyFunction', replace the call to 'ToLower' with 'ToUpperInvariant'.

如果我使用ToUpperInvariant(),则会收到错误消息(我已经知道EF Core 3.0中的LINQ breaking changes):

The LINQ expression (... all the expression...) could not be translated. Either rewrite the query in a form that can be translated, or switch to client evaluation explicitly by inserting a call to either AsEnumerable(), AsAsyncEnumerable(), ToList(), or ToListAsync().

所以,我是起点。

是否可以同时符合CA1304并在数据库而不是客户端中运行查询?

1 个答案:

答案 0 :(得分:0)

正如PanagiotisKanavos所说,解决方案是简单地使用a.Name == b。简单而且有效!