В LINQ, что делает комбинация ключевых слов select new
?
Я не нашел много документации по этому вопросу.
Спасибо
В LINQ, что делает комбинация ключевых слов select new
?
Я не нашел много документации по этому вопросу.
Спасибо
Используя select new
, вы можете использовать данные или объекты из набора, с которым работаете, для создания новых объектов, либо набрав анонимно или обычно.
1. Использование select new
для возврата новых анонимно типизированных объектов:
var records = from person in people
select new { person.name, person.id };
Для создания набора анонимно типизированных объектов используется ключевое слово new
. Новый тип объекта просто создается компилятором с двумя свойствами. Если вы посмотрите на тип объекта в отладчике, вы увидите, что у него есть сумасшедшее, автогенерированное имя типа. Но вы также можете использовать ключевое слово new
так же, как и вы, за пределами linq:
2. Используя select new
для создания "регулярно" типизированных объектов:
var records = from person in people
select new CreditRecord(person.creditLimit, person.name);
В этом примере используется ключевое слово new
так же, как вы привыкли - для создания некоторого известного типа объекта через один из его конструкторов.
Select называется оператором преобразования (или проекции). Он позволяет вам поместить данные в набор, с которым вы работаете, через функцию преобразования, чтобы дать вам новый объект с другой стороны. В приведенных выше примерах мы просто "трансформируем" объект человека в какой-то другой тип, выбирая только определенные свойства объекта-человека и делая с ними что-то. Таким образом, комбинация select new ...
действительно просто указывает операцию new
как функцию преобразования оператора select
. Это может иметь большее значение с помощью встречного примера для двух предыдущих:
3. Используя select
без new
, без преобразования
Конечно, вам не нужно использовать select
и new
вместе. Возьмите этот пример:
var someJohns = from person in people
where person.name == "John"
select person;
Это возвращает исходный тип объекта, который был в комплекте, с которым вы работали, - без преобразования и создания нового объекта.
4. Используя select
без new
, с преобразованием
И, наконец, преобразование без ключевого слова new
:
var personFoods = from person in people
select person.GetFavoriteFoods();
который возвращает вам новый тип объекта, созданный из функции преобразования, а не напрямую с помощью ключевого слова new
для его создания.
Это ключевое слово select
, за которым следует выражение new
, возможно создающее анонимный тип.
Другими словами, это комбинация следующих двух несвязанных выражений:
select
from a in whatever select 2
new { Prop1 = 3, Prop2 = DateTime.Now }
На самом деле это не комбинация, new
просто создает анонимный тип для возврата значения. В противном случае вам придется работать со словарями/массивами и т.д. (Как в PHP), который всегда уродлив.
var q =
from staff in theWhiteHouseStaff
select new { Name = staff.Name } ;