最初我有这种方法:
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?
答案 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());
}
但我不认为比较会慢得多......