2011-10-01 16 views
5

Jestem całkowicie nowy w Linq i zastanawiam się, czy możesz mi pomóc zrozumieć różnicę między następującym Linq? Na przykład ...LINQ - różnica między. Wybierz (n => n.Nazwa) i. Wybierz (n => nowe {n.nazwa});

//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/>"); 

Jedyna różnica widzę, że w normalnym wybierzesz, tym firstname (string) jest przechowywany w kolekcji, natomiast w wybierz nowy obiekt kontakt jest zapisany w Collecton a dostęp do imienia następuje przez jego własność. Również select new zwraca właściwości wybrane tylko w instrukcji.

Kolejną różnicą, którą zauważyłem, jest to, że możesz zwrócić wiele konkretnych właściwości w nowym Wybierz.

W jakim scenariuszu wybierzesz jeden z drugim?

Dzięki za pomoc.

+1

Oto scenariusz: 'select new {n.FirstName, n.LastName}' –

Odpowiedz

20

n => n.FirstName daje Ci string

n => new { n.FirstName } daje anonymous type, z jednym string własności zwanej FirstName

w ogóle, typ anonimowy z tylko jedną właściwość prawdopodobnie nie jest to, czego szukasz, tak Poszedłbym na pierwszą opcję.

6

Aby wspierać Richarda EV odpowiedź:

Jeśli nie są zaznajomieni z typów anonimowy, złamać się ildasm i dać exe jako wejście do niego.

Dostaniesz coś takiego:

enter image description here

Rzecz że widzisz zaczynając <> f_AnonymousType() jest jeden, że Richard Ev mówi. Twoja składnia new została przetłumaczona na nową klasę (nazwa została określona przez kompilator). Dlatego słowo kluczowe var jest tak pomocne w pracy z anonimowym typem.

Powiązane problemy