LINQ - разница между .Select (n => n.Name) и .Select (n => new {n.Name}); - PullRequest
5 голосов
/ 01 октября 2011

Я совершенно новичок в Linq и задаюсь вопросом, можете ли вы помочь мне понять разницу между следующим Linq? Например ...

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

Единственное отличие, которое я вижу, состоит в том, что при обычном выборе имя (строка) сохраняется в коллекции, тогда как при выборе нового объект контакта сохраняется в коллекции, а доступ к имени осуществляется по его свойству. Также select new возвращает свойства, только выбранные в операторе.

Еще одно отличие, которое я заметил, заключается в том, что вы можете вернуть несколько определенных свойств в select new.

В каком сценарии вы бы выбрали один из других?

Спасибо за помощь.

Ответы [ 2 ]

20 голосов
/ 01 октября 2011

n => n.FirstName дает вам string

n => new { n.FirstName } дает вам анонимный тип с одним свойством string, которое называется FirstName

InВ общем, анонимный тип только с одним свойством, вероятно, не то, что вы ищете, поэтому я бы выбрал первый вариант.

6 голосов
/ 01 октября 2011

Для поддержки ответа Ричарда Эва:

Если вы не знакомы с анонимными типами, разберитесь с ildasm и предоставьте свой exe как вход для него.

Вы получите что-то вроде этого:

enter image description here

То, что вы видите, начиная с <> f_AnonymousType (), - это то, о чем говорит Ричард Эв. Ваш синтаксис new был переведен в новый класс (имя было определено компилятором). Вот почему ключевое слово var так полезно при работе с анонимным типом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...