Linq就是这个字符串。比较查询效率低,是否有更好的方法?

时间:2012-04-18 04:23:03

标签: linq entity-framework

最初我有这种方法:

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必须非常低效。比较用户?

有没有更好的方法来写这个没有string.Compare?

3 个答案:

答案 0 :(得分:6)

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

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

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

答案 1 :(得分:2)

我会使用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);

答案 2 :(得分:1)

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

        }

但我不认为比较会慢得多......