String.Equals()无法正常工作
我正在使用LINQ搜索我的一个Entity Framework表,并根据名称找到一个“组”。 名称是一个字符串,看起来是Unicode(说它在edmx中)。 我有一个方法GetGroup()
,我传入一个名称来搜索。 通过代码调试,我已经在我的数据库中有一个名为“Test”的组。 一旦我传入一个名为“TEST”的组,我希望它返回已经在数据库中的“Test”。 它出于某种原因,没有找到“测试”并认为“测试”不存在。 这是我的查询,我不明白为什么它不起作用。 请帮忙。
“name”是组名中传递的。 我的.Equals
似乎只有在gr.Name
和name完全相同时才有效。 如果一个字符在两个字符串之一中是大写字母,则.Equals不起作用。 我曾尝试使用InvariantCultureIgnoreCase
,这似乎没有帮助。 如果有人问, MyLeagueId
和LeagueId
将始终匹配,则设置数据库,以便可以有一个不同联盟ID的组。 我不认为这是问题所在。
Group g = (from gr in this.DatabaseConnection.Groups where gr.Name.Equals(name, StringComparison.OrdinalIgnoreCase) && gr.LeagueId == this.MyLeagueId select gr).FirstOrDefault();
使用LINQ to Entities时,它会自动将其转换为LINQ to SQL。 如果您正在进行.Equals on的数据库字段没有NOCASE的整理(在我的示例中为SQLite),那么它将始终区分大小写。 换句话说,数据库定义了如何进行字符串比较而不是代码。
与StringComparison.OrdinalIgnoreCase
的字符串比较在内存或IEnumerable
。 您正尝试将它与IQueryable
一起使用,但您的可查询提供程序不理解它。
这对我有用:
db.Users.FirstOrDefault( s => s.Username.Equals(username, StringComparison.OrdinalIgnoreCase) );
做了一些研究。 你做不到。 排序规则(比较类型)在表的列级别定义。 您无法通过EF修改它。 如果它被定义为不区分大小写,那么所有搜索都将不区分大小写。 如果它被定义为区分大小写,那么你唯一的希望是ToUpper()
字符串。
EF4 Linq Oracle11g使查询不区分大小写
LINQ to Entities区分大小写
使用String.Compare()
因为它可以转换为Sql。
以下是Linq中字符串匹配的一些示例,以及Sql转换。
我从技术角度来看TravyGuy的答案。 要获得更直接,实用的答案,请尝试使用:
string.Compare(string A, string B, StringComparison.OrdinalIgnoreCase) == 0
尝试name.Equals(gr.Name, StringComparison.OrdinalIgnoreCase)
如果它工作,那么问题可能gr.Name
。
—编辑—
我猜测gr.Name
不是System.string
类型。 (因为String.Equals
在前一篇文章中给出了一个错误==>)
试一试
(gr.Name as string).Equals(name, StringComparison.OrdinalIgnoreCase)
要么
String.Equals((gr.Name as string), name, StringComparison.OrdinalIgnoreCase)