En la práctica, sí, las palabras clave de LINQ se asignan a los métodos de extensión. Pero en realidad, es más interesante; es, literalmente, como si los sustitutos del compilador directamente para algunos métodos clave, es decir
var qry = from cust in db.Customers
where cust.IsActive
select cust;
se convierte en:
var qry = db.Customers.Where(cust => cust.IsActive);
(si tuviéramos un no trivial de selección, que añadiría .Elija (.. .some proyección ...)
Different mapa LINQ kewords a diferentes métodos - es decir, hay OrderBy, GroupBy, ThenBy, OrderByDescending, etc.
En el caso de IEnumerable<T>
/IQueryable<T>
, esto luego resuelve estos a través de métodos de extensión (generalmente cortesía de Enumerable
/Queryable
). Sin embargo, si sus objetos consultables declararon su propio Where/OrderBy/etc, estos se usarían de preferencia.
Jon Skeet cubre esto mucho más en las últimas partes de C# in Depth. También he visto an example of Jon's donde discute algunas implicaciones realmente extrañas de esto, como llamar a métodos estáticos en un tipo.
Salir de Seleccionar() es solo una optimización. Todavía requiere un Seleccionar() incluso cuando se trata de una llamada a Seleccionar (x => x); –
Sí, pero es una optimización que sí lo hace. Dejará Select in si tiene "var qry = from x en y select x" - es decir, se convierte en "var qry = y.Select (x => x)" - sin embargo, en muchos de los otros casos simples típicos lo omitirá (a menos que tenga una proyección no trivial). –