String.Equals()无法正常工作

我正在使用LINQ搜索我的一个Entity Framework表,并根据名称找到一个“组”。 名称是一个字符串,看起来是Unicode(说它在edmx中)。 我有一个方法GetGroup() ,我传入一个名称来搜索。 通过代码调试,我已经在我的数据库中有一个名为“Test”的组。 一旦我传入一个名为“TEST”的组,我希望它返回已经在数据库中的“Test”。 它出于某种原因,没有找到“测试”并认为“测试”不存在。 这是我的查询,我不明白为什么它不起作用。 请帮忙。

“name”是组名中传递的。 我的.Equals似乎只有在gr.Name和name完全相同时才有效。 如果一个字符在两个字符串之一中是大写字母,则.Equals不起作用。 我曾尝试使用InvariantCultureIgnoreCase ,这似乎没有帮助。 如果有人问, MyLeagueIdLeagueId将始终匹配,则设置数据库,以便可以有一个不同联盟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()字符串。

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区分大小写

使用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)