#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
ключевое слово так полезно при работе с анонимным типом.