2011-10-01 13 views
5

Soy completamente nuevo en Linq y me pregunto si puede ayudarme a entender la diferencia entre los siguientes Linq. Por ejemplo ...LINQ - La diferencia entre .Select (n => n.Name) y .Select (n => new {n.Name});

//normal select 
var contacts = entity.Contacts.Select(n => n.FirstName); 

//select new 
var contacts2 = entity.Contacts.Select(n => new { n.FirstName }); 

//normal select output 
foreach (var c in contacts) 
    Response.Write(c + "<br/>"); 

//select new output 
foreach (var c in contacts2) 
    Response.Write(c.FirstName + "<br/>"); 

La única diferencia que veo es que en el selecto normal, el primer nombre (cadena) se almacena en la colección, mientras que en el selecto nueva, un objeto de contacto se almacena en el collecton y al primer nombre al que accede su propiedad. Además, el seleccionar nuevo devuelve las propiedades solo seleccionadas en la declaración.

Otra diferencia que noté es que puede devolver varias propiedades específicas en la nueva selección.

¿En qué escenario elegiría uno sobre el otro?

Gracias por la ayuda.

+1

Aquí hay una situación: 'select new {n.FirstName, n.LastName}' –

Respuesta

20

n => n.FirstName le da una string

n => new { n.FirstName } le da una anonymous type, con una propiedad llamada stringFirstName

En general, un tipo anónimo con una sola propiedad no es probablemente lo que usted está buscando, por lo Yo iría por la primera opción.

6

Para apoyar la respuesta de Richard Ev:

Si no está familiarizado con los tipos anónimos, Crack Up ildasm y darle a su exe como una entrada a la misma.

obtendrá algo como esto:

enter image description here

Lo que ves comenzando con <> f_AnonymousType() es la que Richard Ev está hablando. Su sintaxis de new se tradujo a una nueva clase (el nombre fue decidido por el compilador). Es por eso que la palabra clave var es tan útil para trabajar con tipos anónimos.

Cuestiones relacionadas