String.Equals() 未按预期工作

问题描述 投票:0回答:7

我正在使用 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();
c# linq entity-framework-4 equals
7个回答
48
投票

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

这对我有用:

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

46
投票

使用LINQ to Entities时,它会自动将其转换为LINQ to SQL。如果您正在执行 .Equals 的数据库字段没有 NOCASE 排序规则(在我的示例中为 SQLite),那么它将始终区分大小写。换句话说,数据库定义了如何进行字符串比较而不是代码。


15
投票

使用

String.Compare()
,因为它可以翻译为 Sql。

这里是 Linq 中字符串匹配的一些示例,以及 Sql 翻译。


10
投票

做了一些研究。你做不到。排序规则(比较类型)是在表的列级别定义的。您无法通过 EF 修改它。如果定义为不区分大小写,则所有搜索都将不区分大小写。如果它被定义为区分大小写,那么你唯一的希望就是

ToUpper()
字符串。

http://connect.microsoft.com/VisualStudio/feedback/details/435783/entity-framework-conceptual-model-doesnt-support-string-equals-via-linq

http://social.msdn.microsoft.com/Forums/en/adodotnetentityframework/thread/3810aa67-f6fe-4624-a14b-eaaa0e05ddcd

EF4 Linq Oracle11g 使查询不区分大小写

LINQ to Entities 区分大小写比较


6
投票

我从技术角度喜欢 TravyGuy 的回答。 要获得更直接、实用的答案,请尝试使用:

string.Compare(string A, string B, StringComparison.OrdinalIgnoreCase) == 0

2
投票

尝试

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)

0
投票

试试这个!

EF.Functions.Collate(gr.Name, "SQL_Latin1_General_CP1_CI_AS") == name
© www.soinside.com 2019 - 2024. All rights reserved.