String.Equals() not working as intended

偶尔善良 提交于 2019-11-26 22:38:32

When using LINQ to Entities, it will automatically convert it to LINQ to SQL. And if the database field you are doing a .Equals on does not have a collate of NOCASE (SQLite in my example) then it will always be case-sensitive. In otherwords, the database defines how to do the string comparison rather than code.

Swapnil Malap

The string comparison with StringComparison.OrdinalIgnoreCase works in memory or with IEnumerable<T>. You are trying to use it with IQueryable<T>, but the provider of your queryable does not understand it.

This works for me:

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

Made some research. You can't do. The collation (the type of comparison) is defined at the column level of the table. You can't modify it through EF. If it's defined as case insensitive, then all the searches will be case-insensitive. If it's defined as case sensitive, then your only hope is ToUpper() the strings.

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

Jowen

Use the String.Compare() as it can be translated to Sql.

Here are some examples of string matching in Linq, with the Sql translation as well.

I like TravyGuy's answer from a technical perspective. For a more direct, practical answer, try using:

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

Try name.Equals(gr.Name, StringComparison.OrdinalIgnoreCase)

If it works then the problem could be with gr.Name.

--- Edit ---

I'm guessing that gr.Name is not of type System.string. (since String.Equals gives you an error ==> from the previous post)

give this a shot

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

or

String.Equals((gr.Name as string), name, StringComparison.OrdinalIgnoreCase)
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!