我正在阅读关于Linq到Sql字符串比较的矛盾解释。
当我执行以下操作时:
from p in db.People
where p.UserName=username
select p
用户名= “约翰”
我得到了正确的不区分大小写的结果。 Linq是默认执行此操作还是在SQL数据库中执行此操作?
答案 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没有这样做。