Tra*_*uy9 38 c# linq equals entity-framework-4
我正在使用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();
Run Code Online (Sandbox Code Playgroud)
Tra*_*uy9 41
使用LINQ to Entities时,它会自动将其转换为LINQ to SQL.如果您正在进行.Equals on的数据库字段没有NOCASE(在我的示例中为SQLite)的整理,那么它将始终区分大小写.换句话说,数据库定义了如何进行字符串比较而不是代码.
小智 34
字符串比较与StringComparison.OrdinalIgnoreCase内存或与内存工作IEnumerable<T>.您正在尝试使用它IQueryable<T>,但您的可查询提供程序不理解它.
这对我有用:
db.Users.FirstOrDefault(
s => s.Username.Equals(username, StringComparison.OrdinalIgnoreCase)
);
Run Code Online (Sandbox Code Playgroud)
做了一些研究.你做不到.排序规则(比较类型)在表的列级别定义.您无法通过EF修改它.如果它被定义为不区分大小写,那么所有搜索都将不区分大小写.如果它被定义为区分大小写,那么你唯一的希望就是ToUpper()字符串.
从技术角度来看,我喜欢TravyGuy的回答。有关更直接,更实际的答案,请尝试使用:
string.Compare(string A, string B, StringComparison.OrdinalIgnoreCase) == 0
Run Code Online (Sandbox Code Playgroud)