Linq就是这个字符串。在查询中进行比较,是否有更好的方法?
我最初有这样一种方法:Linq就是这个字符串。在查询中进行比较,是否有更好的方法?,linq,entity-framework,Linq,Entity Framework,我最初有这样一种方法: public virtual User GetUser(string username) { return _db.Users.Single(x => x.UserName == username); } 所以基本上是一个linq方法,它根据用户的用户名获取用户 问题是,我发现有时用户名在开始时带有大写字符,所以它并不总是起作用 于是我想到: public virtual User GetUser(strin
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));
}
这很有效。然而,我知道这一定是非常低效的做一个字符串。比较用户
有没有更好的方法不用字符串来写这个。比较一下
public virtual User GetUser(string username)
{
return _db.Users.Single(x => x.UserName.ToLower() == username.ToLower());
}
但是我认为比较不会慢很多,尽管……String.compare不在实体框架支持的函数列表中(请参阅) 这意味着,当您执行此查询时,实体框架将检索执行此比较和本地执行比较所需的整个数据集。这将是非常缓慢的 更好的解决方案是使用==来比较字符串,例如:
return _db.Users.Single(x => x.UserName == username);
我会使用
String.Equals
return _db.Users.Single(x =>
String.Equals(x.UserName, username, StringComparer.OrdinalIgnoreCase))
如果我想将“martin”与“martin”(重音)匹配,我会使用String.Compare
return _db.Users.Single(x =>
string.Compare(x.UserName, username, CultureInfo.CurrentCulture, CompareOptions.IgnoreNonSpace);
Luke-你的意思可能是你必须自己解析列表,然后在该集合上执行
string.Compare()
?虽然你对实际问题的回答是正确的,但令人困惑的是,你认为EF将解决整个问题。@JosephD。这根本不是我的意思。看看上面生成的DB查询(例如,select*from UserName==“bob”
)EF将接受查询并将其转换为SQL,根本没有使用string.Compare()。@Luke.Yes,你是对的-也许我解释得很模糊。您的回答提到string.Compare()
不受支持,而且措辞使EF似乎会忽略它。实际上,它会抛出一个异常。不管怎样,我的坏:)正如上面的一个答案所说,这是一个相当沉重的电话。