LINQ: Различие между 'Выбором c' и 'Выбирает новый (c …'

Поскольку C, где порожденное понятие, 30 лет, и тогда, это был единственный жизнеспособный способ соединить код из нескольких файлов.

Сегодня, это - ужасный взлом, который полностью уничтожает время компиляции в C++, бесчисленные бесполезные зависимости причин (потому что определения классов в заголовочном файле представляют слишком много информации о реализации), и так далее.

5
задан Waheed 10 August 2009 в 10:54
поделиться

4 ответа

В чем разница между этими двумя операторами

Первый возвращает отфильтрованную последовательность исходного / полного исходного объекта; второй по-прежнему выполняет фильтр, но возвращает последовательность анонимного типа с только с этими тремя свойствами.

Есть ли в этих заявлениях какие-либо проблемы, связанные с производительностью

Производительность зависит от серверной части. Если это LINQ-to-Objects, то с new {...} вы создаете дополнительные объекты (анонимные типы) для каждой записи, поэтому могут возникнуть очень небольшие накладные расходы. Однако, если это LINQ-to-SQL и т. Д. (Серверная часть базы данных), то это может быть огромным преимуществом . Конструктор запросов проверит, какие столбцы необходимы, и выберет только три из вашего анонимного типа; если у вас (например) большой двоичный объект (или просто длинный varchar ) в ваших данных, который вам не нужен, это может быть огромным преимуществом.

Дополнительные примечания: вы не можете включать анонимные типы в сигнатуру метода, поэтому вы можете обнаружить, что для этой цели вам нужно объявить свой собственный тип DTO:

return new CustomerDto { Company = c.Company, Entered = c.Entered, PK = c.pk};
...
public class CustomerDto { ... }
10
ответ дан 18 December 2019 в 11:59
поделиться

Основное отличие состоит в том, что первый пример возвращает ссылки на существующие экземпляры, а второй пример создает новые экземпляры анонимного типа. Меня больше беспокоит эта проблема, чем любые возможные проблемы с производительностью.

2
ответ дан 18 December 2019 в 11:59
поделиться

Если есть сомнения, профиль.

Но да, я думаю, что это накладные расходы на производительность. Если вы сделаете , выберите c , тогда коллекция будет содержать ссылки на исходные элементы. Если вы сделаете select new {...} , то C # создает для вас анонимный тип, создавая новые экземпляры этого типа и заполняя их данными. Для меня это определенно медленнее.

1
ответ дан 18 December 2019 в 11:59
поделиться

Я провел несколько тестов (с использованием секундомера). Ни в одном случае анонимные типы не были быстрее, в Linq-to-SQL (против SQL Server), Linq-to-Entities (против MySQL) и Linq-to-Objects (против List). Фактически, обычно это было медленнее, в зависимости от того, сколько столбцов вы выбрали.

Один из моих результатов: Я выполнял каждый запрос 5000 раз для таблицы с 5 столбцами, заполненной 400 строками с помощью Linq-to-Entities.

анонимный объект (выбор 1 столбца): 17314 мс

анонимный объект (выбор 5 столбцов): 19193 мс

исходный объект: 16055 мс

В любом случае, лучший способ выяснить это - протестировать его самостоятельно (на написание хорошего сообщения уходит время).

2
ответ дан 18 December 2019 в 11:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: