最初我有这个方法:
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() 方法。