2011-03-07 45 views
5

Al hacer una combinación en LINQ comocuál es la diferencia entre el lado izquierdo y el lado derecho de los iguales en una LINQ se unen

from c in customers join x in somelistofcustomers on x.Id equals c.Id

que obtendrá el error

x es no en el alcance en el lado izquierdo de 'iguales'. Considere el canje de las expresiones a ambos lados de 'es igual a'

bastante simple de hacer, pero me gustaría alguna aclaración por qué X no está en el ámbito en el lado izquierdo, pero de alguna manera está en el ámbito en el lado derecho de equals

Respuesta

8

Esto tiene que ver con la forma en que el compilador expande LINQ en los métodos de extensión subyacentes.

Su petición está siendo traducido a:

customers.Join(somelistofcustomers, c => x.Id, x => c.Id, (c, x) => ...) 

Los dos Expresiones Lambda c => x.Id & x => c.Id tienen claramente sus variables locales fuera de alcance. Como LINQ es solo una buena capa de azúcar sobre las llamadas reales, el compilador se queja de que la variable está fuera del alcance.

2

es sólo una convención, básicamente la estructura de una unión es el siguiente

from identifier in {outer-sequence} 
join identifier2 in {inner-sequence} 
on {outer-key-selector} equals {inner-key-selector} 

identifier y {outer-key-selector} están emparejados, y también lo son identifier2 y {inner-key-selector} - no se puede cambiar el orde r, porque su posición está fija en la sintaxis de unión.

Cuestiones relacionadas