LINQ到实体和LINQ到对象有不同的规则。就这么简单。例如,在LINQ to Entities中,我可以运行如下查询:
var foo = Context.Foos.Where(f => f.Bar.Something == bar);
... 如果
f.Bar
如果是空引用,则此语句仍然可以正常工作,因为
f.Bar.Something
将合并到
null
. 如果您考虑一下SQL是如何工作的,使用左连接,这就不奇怪了。另一方面,在LINQ to objects中
Where
正如你所发现的,还有其他方面的不同。区分大小写就是其中之一。执行LINQ to Entities查询时,会将其转换为SQL。相等比较是基于数据库和SQL中定义的排序规则执行的。要自定义数据库的排序规则,通常需要为列选择特定的排序规则。另一方面,要自定义对象的排序规则,通常需要传递一个比较函数,这在LINQ中永远不会被接受,因为函数(与表达式相反)不能转换为SQL。
var foo = Context.Foos.Where(f => f.SomeString.Equals(someValue, StringComparison.OrdinalIgnoreCase));