Linq对Sql案例不敏感的平等

时间:2009-12-05 22:51:01

标签: linq-to-sql

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

当我执行以下操作时:

  from p in db.People 
  where p.UserName=username
  select p

用户名= “约翰”

我得到了正确的不区分大小写的结果。 Linq是默认执行此操作还是在SQL数据库中执行此操作?

3 个答案:

答案 0 :(得分:4)

我认为根据db变量指向的内容和实际执行比较的位置,会得到冲突的结果。如果可以的话,linq将构建查询并将其发送到SQL服务器。看起来你可以通过调用

强制不区分大小写
where p.UserName.ToLower()=username.ToLower()

答案 1 :(得分:3)

您的示例查询将转换为大致类似的内容:

选择[t0] .col1,[t0] .col2,...,[t0] .coln 来自[架构]。[人物] 其中[t0] .UserName = @ p0

...用户名变量中的值将在@p0 sql变量中传递。因此,区分大小写,重音敏感度等由您设置要使用的SQL Server实例/ db / table /列的排序规则控制。如果未在其他任何位置指定,则使用DB或数据库实例的默认排序规则,但可以将排序规则一直指定到列级别。

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

这与你执行与L2O(linq到对象)查询相同的事情形成了对比,在这种情况下,区分大小写是默认值,你必须通过使用string.equals覆盖它来使它不区分大小写允许您指定文化和/或不区分大小写...

答案 2 :(得分:1)

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

阅读on MSDNthis article