我正在使用LINQ搜索我的一个Entity Framework表,并根据名称找到一个“组”。名称是一个字符串,看起来是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();
答案 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()
字符串。
答案 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)