gpt4 book ai didi

c# - 不区分大小写的字符串比较在 C# 中不起作用?

转载 作者:可可西里 更新时间:2023-11-01 03:14:07 25 4
gpt4 key购买 nike

基于对这个问题的回答:

How can I do a case insensitive string comparison?

我正在尝试不使用 Compare 或 ToLower 进行不区分大小写的比较:

var user = db.Users.FirstOrDefault(s => String.Equals(s.Username, username, StringComparison.OrdinalIgnoreCase));

但是我得到一个错误:

Incorrect number of arguments supplied for call to method 'Boolean Equals(System.String, System.String, System.StringComparison)'

我做错了什么?

最佳答案

字符串与StringComparison.OrdinalIgnoreCase的比较在内存中工作或使用 IEnumerable<T> .您正在尝试将其与 IQueryable<T> 一起使用,但您的可查询对象的提供者不理解它。

在 Linq-to-Sql 中你应该可以使用 SqlMethods.Like(s.UserName, userName) ,像这样:

var user = db.Users.FirstOrDefault(s => SqlMethods.Like(s.UserName, userName));

SqlMethods位于 System.Data.Linq.SqlClient 命名空间中。

Like方法不区分大小写,因此您应该会得到预期的结果。

EDIT : I tried and get "LINQ to Entities does not recognize the method Boolean Like(System.String, System.String) method, and this method cannot be translated into a store expression."

这似乎是 EF ( link) 的一个已知问题。

This works for me:

db.Users.FirstOrDefault(
s => s.Username.Equals(username, StringComparison.OrdinalIgnoreCase)
);

看起来虽然 EF 很难翻译静态 Equals到 SQL,翻译实例没有问题 Equals .这是一个很好的发现 - 它提供了一个易于阅读、高性能的解决方案。

您还可以使用更简单的方法 ToUpperCaseToLowerCase ,但这可能会阻止查询优化器使用索引:

// Warning: this may not perform well.
var user = db.Users.FirstOrDefault(s => s.UserName.ToUpperCase() == userName.ToUpperCase());

关于c# - 不区分大小写的字符串比较在 C# 中不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19602589/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com