LINQ — разница между .Выберите (n => n.Name ) и .Выберите (n => создать { n.Name } );

#c# #.net #linq #entity-framework

#c# #.net #linq #entity-framework

Вопрос:

Я совершенно новичок в 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/>");
  

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

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

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

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

Комментарии:

1. Вот сценарий: select new { n.FirstName, n.LastName }

Ответ №1:

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

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

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

Ответ №2:

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

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

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

введите описание изображения здесь

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