我在 .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 评论