微软改变这些运营商的顺序的原因是什么?
Microsoft不使用select-from-where
并将此订单更改为from-where-select
。为什么?
它只是为了更好的智能感知吗?
答案 0 :(得分:8)
它不仅允许更好的智能感知,而且它恰当地反映了实际的操作顺序。例如,from e in Employees where e.Age > 65 select e.Salary
将被重写为Employees.Where(e => e.Age > 65).Select(e => e.Salary)
。
写Select(e => e.Salary).Employees.Where(e => e.Age > 65)
是没有意义的。
答案 1 :(得分:8)
正如其他人所提到的,它使IntelliSense成为可能,它使查询的读取顺序与操作实际完成的顺序相同:首先获取集合,然后过滤它,然后投影过滤后的结果。
第三个原因是这个命令使范围规则更加合理。您会注意到在C#中,您从未引入“向左流动”的新范围。在SQL中,由FROM带入范围的东西用于FROM的左侧。在C#语法中,必须显式使用范围变量,因此必须在使用它们的代码的左侧声明它们;然后,范围变量在查询的各个部分的范围内。
范围规则中的一个奇怪之处是join子句。当你说
from c in customers
join o in orders on c.Id equals o.CustomerId
...
范围变量c
在on
和equals
之间,但o
不在范围内。范围仍然向右流动,但在某些情况下它可以跳过子条款。
答案 2 :(得分:6)
LINQ不仅适用于数据库相关操作,还适用于内存数据的一般查询和投影。还要考虑LINQ查询表达式语法为语法糖的lambda表达式和扩展方法。
var query = from foo in foos
where foo.Bar == "Blah"
select foo.Id;
是
的语法糖var query = foos.Where(foo => foo.Bar == "Blah").Select(foo => foo.Id);
现有的查询表达式语法接近于lambda / extension语法,无论如何,编译器所做的第一件事就是将前者转换为后者。它更能描述实际发生的事情的顺序。