3

最初我有这个方法:

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?

4

3 回答 3

10

String.Compare 不在实体框架支持的函数列表中(请参阅支持的函数列表)这意味着当您执行此查询时,实体框架将检索执行此比较所需的整个数据集并在本地执行比较。这将非常缓慢。

一个更好的解决方案是使用 == 来比较字符串,例如:

return _db.Users.Single(x => x.UserName == username);
于 2012-04-18T05:23:32.530 回答
4

我会用String.Equals

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

如果我想将“Martín”与“martin”(口音)匹配,我会使用String.Compare.

return _db.Users.Single(x => 
         string.Compare(x.UserName, username, CultureInfo.CurrentCulture, CompareOptions.IgnoreNonSpace);
于 2014-08-14T23:44:52.073 回答
2
public virtual User GetUser(string username)
        {
            return _db.Users.Single(x => x.UserName.ToLower() == username.ToLower());

        }

But I don't think the compare will be much slower though....

于 2012-04-18T04:29:39.333 回答