String.Equals()无法正常工作

时间:2011-02-22 16:14:14

标签: c# linq entity-framework-4 equals

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

“name”是在组名中传递的。如果.Equals和名称完全相同,我的gr.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();

6 个答案:

答案 0 :(得分:39)

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

答案 1 :(得分:31)

StringComparison.OrdinalIgnoreCase的字符串比较在内存或IEnumerable<T>中有效。您正尝试将其与IQueryable<T>一起使用,但您的可查询提供程序无法理解它。

这对我有用:

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

答案 2 :(得分:9)

做了一些研究。你做不到。排序规则(比较类型)在表的列级别定义。您无法通过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 making queries none case-sensitive

LINQ to Entities case sensitive comparison

答案 3 :(得分:6)

使用String.Compare(),因为它可以转换为Sql。

Here是Linq中字符串匹配的一些示例,也是Sql转换。

答案 4 :(得分:4)

我从技术角度来看TravyGuy的回答。 如需更直接,实用的答案,请尝试使用:

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

答案 5 :(得分:3)

尝试name.Equals(gr.Name, StringComparison.OrdinalIgnoreCase)

如果有效则问题可能出在gr.Name

---编辑---

我猜测gr.Name不属于System.string类型。 (因为String.Equals会在上一篇文章中给出错误==&gt;)

试一试

(gr.Name as string).Equals(name, StringComparison.OrdinalIgnoreCase)

String.Equals((gr.Name as string), name, StringComparison.OrdinalIgnoreCase)