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似乎会忽略它。实际上,它会抛出一个异常。不管怎样,我的坏:)正如上面的一个答案所说,这是一个相当沉重的电话。