2012-04-18 84 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

相关问题