![](/img/trans.png)
[英]string.Equals is not working as I expected in asp.net webforms
[英]String.Equals() not working as intended
我正在使用LINQ搜索我的一個Entity Framework表,並根據名稱找到一個“組”。 名稱是一個字符串,看起來是Unicode(說它在edmx中)。 我有一個方法GetGroup()
,我傳入一個名稱來搜索。 通過代碼調試,我的數據庫中已經有一個名為“Test”的組。 一旦我傳入一個名為“TEST”的組,我希望它返回已經在數據庫中的“Test”。 它出於某種原因,沒有找到“測試”並認為“測試”不存在。 這是我的查詢,我不明白為什么它不起作用。 請幫忙。
“name”是組名中傳遞的。 我的.Equals
似乎只有在gr.Name
和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();
使用LINQ to Entities時,它會自動將其轉換為LINQ to SQL。 如果您正在進行.Equals on的數據庫字段沒有NOCASE(在我的示例中為SQLite)的整理,那么它將始終區分大小寫。 換句話說,數據庫定義了如何進行字符串比較而不是代碼。
與StringComparison.OrdinalIgnoreCase
的字符串比較在內存或IEnumerable<T>
。 您正嘗試將其與IQueryable<T>
一起使用,但您的可查詢提供程序無法理解它。
這對我有用:
db.Users.FirstOrDefault(
s => s.Username.Equals(username, StringComparison.OrdinalIgnoreCase)
);
做了一些研究。 你做不到。 排序規則(比較類型)在表的列級別定義。 您無法通過EF修改它。 如果它被定義為不區分大小寫,那么所有搜索都將不區分大小寫。 如果它被定義為區分大小寫,那么你唯一的希望是ToUpper()
字符串。
使用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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.