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

时间:2010-04-05 04:19:04

标签: c# linq

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

3 个答案:

答案 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

...

范围变量conequals之间,但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语法,无论如何,编译器所做的第一件事就是将前者转换为后者。它更能描述实际发生的事情的顺序。