2012-04-18 53 views
2

本來我有這個方法:LINQ的是這個string.Compare查詢效率低下,有沒有更好的辦法?

public virtual User GetUser(string username) 
     { 
      return _db.Users.Single(x => x.UserName == username); 
     } 

所以基本上系統會根據人的用戶名的用戶LINQ的方法。

麻煩的是,我發現,有時候用戶名是在開始未來通過以大寫字母所以它並不總是工作。

於是我想出了:

public virtual User GetUser(string username) 
     { 
      return _db.Users.Single(x => (string.Compare(x.UserName, username, true) == 0)); 
     } 

這工作。然而,我得到這一定是真的低效率做一個字符串。比較爲用戶?

有沒有更好的方式來寫這篇文章沒有string.Compare?

回答

1
public virtual User GetUser(string username) 
     { 
      return _db.Users.Single(x => x.UserName.ToLower() == username.ToLower()); 

     } 

但我不認爲比較會雖然很慢....

6

String.Compare不是由實體框架支持的功能列表(見Supported Function List) 這意味着,當您執行此查詢時,實體框架將檢索執行此比較所需的整個數據集並在本地執行比較。這將非常緩慢。

一個更好的解決方案是使用==比較字符串,例如:

return _db.Users.Single(x => x.UserName == username); 
+0

盧克 - 你可能意味着你將不得不自己解析列表**,然後在該集合上執行'string.Compare()'操作。雖然你對實際問題的回答是正確的,但你建議EF會自行解決整套問題令人困惑。 – rumblefx0 2016-08-03 09:37:40

+1

@JosephD。那不是我的意思。看看數據庫查詢上述生成(如'SELECT * FROM用戶其中username ==「bob'')EF將採取查詢和翻譯爲SQL,沒有string.Compare()使用的。 – 2016-08-03 12:09:02

+0

@ Luke.Yes,你是對的 - 也許我隱約解釋。你的答案提到'string.Compare()'不被支持,並且措辭使得它看起來好像EF會忽略它。實際上它會拋出一個例外。反正,我的壞:) – rumblefx0 2016-08-03 12:34:02

2

我會用String.Equals

return _db.Users.Single(x => 
      String.Equals(x.UserName, username, StringComparer.OrdinalIgnoreCase)) 

如果我想匹配「馬丁」和「馬丁」 (口音)一樣,我會用String.Compare

return _db.Users.Single(x => 
     string.Compare(x.UserName, username, CultureInfo.CurrentCulture, CompareOptions.IgnoreNonSpace); 
+0

這些都是非常沉重的通話用如上述的答案一說。 – nologo 2017-07-04 06:02:52

相關問題