我正在使用 LINQ 搜索我的一个实体框架表,并根据名称找到一个“组”。该名称是一个字符串,并且似乎是 Unicode(表示它在 edmx 中)。我有一个方法
GetGroup()
,我传入一个名称进行搜索。通过代码调试,我的数据库中已经有一个名为“Test”的组。一旦我传入一个名为“TEST”的组,我希望它返回数据库中已经存在的“Test”。由于某种原因,它找不到“测试”并认为“测试”不存在。这是我的查询,我不明白为什么它不起作用。请帮忙。
“name”是传入的组名。我的
.Equals
似乎只有在 gr.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();
与
StringComparison.OrdinalIgnoreCase
的字符串比较可以在内存中进行,也可以与 IEnumerable<T>
进行比较。您尝试将其与 IQueryable<T>
一起使用,但您的可查询的提供者不理解它。
这对我有用:
db.Users.FirstOrDefault(
s => s.Username.Equals(username, StringComparison.OrdinalIgnoreCase)
);
使用LINQ to Entities时,它会自动将其转换为LINQ to SQL。如果您正在执行 .Equals 的数据库字段没有 NOCASE 排序规则(在我的示例中为 SQLite),那么它将始终区分大小写。换句话说,数据库定义了如何进行字符串比较而不是代码。
做了一些研究。你做不到。排序规则(比较类型)是在表的列级别定义的。您无法通过 EF 修改它。如果定义为不区分大小写,则所有搜索都将不区分大小写。如果它被定义为区分大小写,那么你唯一的希望就是
ToUpper()
字符串。
我从技术角度喜欢 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)
试试这个!
EF.Functions.Collate(gr.Name, "SQL_Latin1_General_CP1_CI_AS") == name