LINQ中的select-from-where顺序发生了变化?是什么原因?

mas*_*ani 5 c# linq

微软改变这些运营商的顺序的原因是什么?Microsoft不使用select-from-where和更改此订单from-where-select.为什么?它只是为了更好的智能感知VS吗?

Gab*_*abe 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).


Eri*_*ert 8

正如其他人所提到的,它使IntelliSense成为可能,它使查询的读取顺序与操作实际完成的顺序相同:首先获取集合,然后过滤它,然后投影过滤后的结果.

第三个原因是这个命令使得范围规则更加合理.您会注意到在C#中,您从未引入"向左流动"的新范围.在SQL中,由FROM带入范围的东西用于FROM的左侧.在C#语法中,必须显式使用范围变量,因此必须在使用它们的代码的左侧声明它们; 然后,范围变量在查询的各个部分的范围内.

范围规则中的一个奇怪之处是join子句.当你说

from c in customers
join o in orders on c.Id equals o.CustomerId
Run Code Online (Sandbox Code Playgroud)

...

范围变量c在范围on和范围之间,equalso不是.范围仍然向右流动,但在某些情况下,它可以跳过这里和那里的子条款.


Ant*_*ram 6

LINQ不仅适用于数据库相关操作,还适用于内存数据的一般查询和投影.还要考虑LINQ查询表达式语法为语法糖的lambda表达式和扩展方法.

var query = from foo in foos
            where foo.Bar == "Blah"
            select foo.Id;
Run Code Online (Sandbox Code Playgroud)

是语法糖

var query = foos.Where(foo => foo.Bar == "Blah").Select(foo => foo.Id);
Run Code Online (Sandbox Code Playgroud)

现有的查询表达式语法接近于lambda/extension语法,编译器所做的第一件事就是将前者转换为后者,无论如何.它更能描述实际发生的事情的顺序.