检查用户名是否存在,区分大小写。
问题的原因是String.equals()方法是区分大小写的,但是EF会将其转换为SQL语句,而SQL语句的大小写匹配取决于该列的排序规则(或者如果该列没有指定排序规则,则取决于数据库的排序规则)。
解决方法之一是在服务器端设置该列的排序规则为区分大小写:
ALTER TABLE Coaches ALTER COLUMN user_name VARCHAR(20) COLLATE Latin1_General_CS_AS
解决方法之二是在客户端通过进行大小写不敏感的搜索来获取所有匹配的记录,然后在Linq-To-Objects中进行过滤:
var query = from t in db.Coaches where String.Equals(t.user_name, username) select t; exists = query.AsEnumerable() .Any(i => i.user_name == username);
只要你没有成千上万个具有不同大小写的相同用户名的用户,通过在Linq-To-Objects中进行过滤应该不会有太大的性能影响。
需要注意的是,更改列的排序规则将影响到使用username进行过滤或排序的任何查询,因此在进行此更改之前,请在独立环境中进行充分的测试。