代码之家  ›  专栏  ›  技术社区  ›  masoud ramezani

在LINQ中从何处更改选择顺序?原因是什么?

  •  5
  • masoud ramezani  · 技术社区  · 15 年前

    微软改变这些运营商的顺序的原因是什么? Microsoft不使用 select-from-where 把这个订单改成 from-where-select . 为什么? 它只是为了更好地理解vs?

    3 回复  |  直到 15 年前
        1
  •  8
  •   Eric Lippert    15 年前

    正如其他人提到的,它使IntelliSense成为可能,并且它使查询以实际执行操作的相同顺序读取:首先获取集合,然后对其进行筛选,然后投影筛选结果。

    第三个原因是这个顺序使得范围界定规则更加合理。您会注意到,在C中,您永远不会引入“流向左边”的新范围。在SQL中,从引入作用域的内容被用于从的左侧。在C语法中,必须显式使用范围变量,因此必须将它们声明到使用它们的代码的左侧;然后范围变量在查询的各个部分的范围内。

    作用域规则中的一个奇怪之处是join子句。当你说

    from c in customers
    join o in orders on c.Id equals o.CustomerId
    

    范围变量 c 在范围内 on 以及 equals 但是 o 不是。作用域仍然向右流动,但在某些情况下它可以跳过这里和那里的子类。

        2
  •  8
  •   Gabe Timothy Khouri    15 年前

    它不仅允许更好的智能感知,而且可以正确地反映操作的实际顺序。例如, 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) .

        3
  •  6
  •   Anthony Pegram    15 年前

    LINQ不仅用于与数据库相关的操作,还用于内存数据的一般查询和投影。还要考虑lambda表达式和扩展方法,Linq查询表达式语法就是它的语法基础。

    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语法,编译器首先要做的就是将前者转换为后者。它更能描述实际发生的事情的顺序。