Linq 就是这个字符串.在查询中比较效率低下,有没有更好的方法



最初我有这个方法:

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

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

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

我会使用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);
public virtual User GetUser(string username)
        {
            return _db.Users.Single(x => x.UserName.ToLower() == username.ToLower());
        }

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

可以使用

EF。属于Microsoft.EntityFrameworkCore 命名空间的 Functions.Like() 方法。

最新更新