Linq to sql Linq到Sql不区分大小写的相等性

Linq to sql Linq到Sql不区分大小写的相等性,linq-to-sql,Linq To Sql,我正在阅读关于Linq到Sql字符串比较的相互矛盾的解释 当我执行以下操作时: from p in db.People where p.UserName=username select p 用户名=“约翰” 我得到了正确的不区分大小写的结果。Linq是在默认情况下这样做的,还是在SQL数据库中这样做的?这取决于数据库。SQL Server 2008将字符串视为不区分大小写,包括在索引表达式中使用时。林克没有这样做 阅读,或者。我认为,根据db变量指向的对象以及实际执行比较的位置,

我正在阅读关于Linq到Sql字符串比较的相互矛盾的解释

当我执行以下操作时:

  from p in db.People 
  where p.UserName=username
  select p
用户名=“约翰”


我得到了正确的不区分大小写的结果。Linq是在默认情况下这样做的,还是在SQL数据库中这样做的?

这取决于数据库。SQL Server 2008将字符串视为不区分大小写,包括在索引表达式中使用时。林克没有这样做


阅读,或者。

我认为,根据db变量指向的对象以及实际执行比较的位置,您会得到相互矛盾的结果。如果可以,linq将构建查询并将其发送到SQL server。看起来你可以通过调用

where p.UserName.ToLower()=username.ToLower()

您的示例查询将大致转换为以下内容:

选择[t0].col1[t0].col2,[t0].coln 来自[schema].[People] 其中[t0]。用户名=@p0

…用户名变量中的值将在@p0 sql变量中传递。因此,区分大小写、区分重音等由您设置SQL Server实例/db/table/column以使用的排序规则控制。如果没有在其他地方指定,则使用DBs或DB实例的默认排序规则,但可以一直指定排序规则,直到列级别

大多数人使用不区分大小写(CI)排序规则运行SQL Server,但正如我前面所说的,它可以在数据库中被重写,因此您只需要检查您在数据库中使用的排序规则


这与如果您执行与L2O(linq to objects)查询相同的操作形成对比,在这种情况下,区分大小写是默认值,您必须使用允许您指定区域性和/或不区分大小写的string.equals重写使其不区分大小写…

是否缺少一些引号?更改变量名的大小写不会影响结果。这不是我上面的意思,抱歉,但这是一个糟糕的建议。p、 UserName.ToLower()=UserName.ToLower()将转换为强制执行完整表扫描的SQL查询。如果“people”表很小,这并不重要,但是如果它是一个大表,那么它将无法使用任何可能覆盖“username”列的索引。区分大小写/不区分大小写取决于您在数据库和/或相关列中使用的排序规则(默认值是在安装sql server时设置的,但可以在多个位置覆盖它,直至列级别)。使用string.equals重写不会有与您在我的结果中评论的问题相同的问题吗?强制所有记录到linq端进行比较?@Jeff,string.equals引用只是比较L2S和L2O的行为,抱歉,如果我不清楚这一点。但是,如果您将两者结合起来并进行评估,则是的作为L2O查询在客户端进行排序,那么它不仅可以获取所有记录,还可以通过网络发送。换句话说,这里使用正确的排序规则是关键。您回复的示例仍将在数据库中进行计算,但由于左侧where子句中的函数调用包装器,会增加表扫描的额外开销谓词。感谢您的回复(我在前面的评论中给出+1)