"

Query expressions provide a language integrated syntax for queries that is similar to relational and hierarchical query languages such as SQL and XQuery.

query-expression:
from-clause query-body

from-clause:
from typeopt identifier in expression

query-body:
query-body-clausesopt select-or-group-clause query-continuationopt

query-body-clauses:
query-body-clause
query-body-clauses query-body-clause

query-body-clause:
from-clause
let-clause
where-clause
join-clause
join-into-clause
orderby-clause

let-clause:
let identifier = expression

where-clause:
where boolean-expression

join-clause:
join typeopt identifier in expression on expression equals expression

join-into-clause:
join typeopt identifier in expression on expression equals expression into identifier

orderby-clause:
orderby orderings

orderings:
ordering
orderings , ordering

ordering:
expression ordering-directionopt

ordering-direction:
ascending
descending

select-or-group-clause:
select-clause
group-clause

select-clause:
select expression

group-clause:
group expression by expression

query-continuation:
into identifier query-body

A query expression begins with a from clause and ends with either a select or group clause. The initial from clause can be followed by zero or more from, let, where, join or orderby clauses. Each from clause is a generator introducing a range variable which ranges over the elements of a sequence. Each let clause introduces a range variable representing a value computed by means of previous range variables. Each where clause is a filter that excludes items from the result. Each join clause compares specified keys of the source sequence with keys of another sequence, yielding matching pairs. Each orderby clause reorders items according to specified criteria.The final select or group clause specifies the shape of the result in terms of the range variables. Finally, an into clause can be used to “splice” queries by treating the results of one query as a generator in a subsequent query." (From C# Unified Specification document)

 

It is important to master the basic concept on how LINQ operates. I think there are too much emphasis on LINQ for "specific provider". There are still unexplored depth in how we can much better construct programs using this declarative/set oriented using LINQ concepts.

So memorize these query expressions keywords to mind : "from, in, select, group, by,  let, where, join, on, equals, orderby, ascending, descending, into,  " and understand what these individual keyword does and you'll be able to freely hack LINQ style in no time. Don't forget to exercise on 101 LINQ Samples and read up C# Standard Query Operators.