拨开荷叶行,寻梦已然成。仙女莲花里,翩翩白鹭情。
IMG-LOGO
主页 文章列表 StringComparison.InvariantCultureIgnoreCase在LINQ查询中使用时无法翻译

StringComparison.InvariantCultureIgnoreCase在LINQ查询中使用时无法翻译

白鹭 - 2022-03-09 1970 0 0

我在 .NET 6 中执行以下查询时遇到问题。

query = context.Where(user =>                       
                      user.Email.Contains(model.Email,
                      StringComparison.InvariantCultureIgnoreCase));

在搜索网络后,我了解到 EF Core 确实翻译了 Contains 以进行服务器端评估 - 但不是接受 StringComparison.InvariantCultureIgnoreCase 或任何其他 StringComparison 的多载。但从未找到解决此问题的正确方法

所以我将查询更改为如下内容以使其作业:

query = context.Where(user =>
                      user.Email.ToLower().Contains(model.Email.ToLower());

即使它正在作业,我对这个解决方案并不完全满意,并且仍然想知道哪种解决方案最能解决我的问题。使用ToLowerInvariant()会是更好的解决方案吗?有没有更好的方法来解决这个问题?


更新

ToLowerInvariant() 不起作用并导致相同的错误 StringComparison.InvariantCultureIgnoreCase

uj5u.com热心网友回复:

似乎您正在 DbSet 上撰写 LINQ 查询。这是不可能的,因为它不能被翻译成 SQL 陈述句。

但是,您可以使用该EF.Functions.Like功能。这将被转换为 SQL 提供程序,并且默认情况下不区分大小写。

query = context.Where(user =>                       
                  EF.Functions.Like(user.Email, model.Email));

uj5u.com热心网友回复:

您的查询如何反应取决于您在服务器端设定的排序规则。毕竟,您的所有 linq 表达式都将被转换为 SQL 查询,并且如何解释将取决于您的数据库和列设定。

您可以尝试在查询中说明排序规则,例如

var customers = context.Customers
    .Where(c => EF.Functions.Collate(c.Name, "latin1_general_ci collation") == "John")
    .ToList();
//SQL_Latin1_General_CP1_CI_AS for SQL Server
//latin1_general_ci collation for MySQL

Microsoft 档案中所述WhereCI代表不区分大小写(与 相对CS)。请注意,Name由于自定义排序规则,此查询将无法利用索引所以最好在列(或表/数据库)上定义它。

标签:

0 评论

发表评论

您的电子邮件地址不会被公开。 必填的字段已做标记 *