As mentioned above, this makes IntelliSense possible, and it makes the request read in the same order that the operations are actually performed: first you get the collection, then you filter it, then you design the filtered results.
The third reason is that this order makes the rules for determining the scope more efficient. You will notice that in C # you never enter a new area that "flows to the left." In SQL, material that is entered into a region by FROM is used to the left of FROM. In C # syntax, range variables must be used explicitly, so they need to be declared to the left of the code that uses them; range variables are then in scope in different parts of the query.
One weird thing about coverage rules is the connection proposal. When you say
from c in customers join o in orders on c.Id equals o.CustomerId
...
the range variable c is in scope between on and equals , but o is not. The scope still moves to the right, but in some cases it may skip the sub here and there.
source share