Поскольку C, где порожденное понятие, 30 лет, и тогда, это был единственный жизнеспособный способ соединить код из нескольких файлов.
Сегодня, это - ужасный взлом, который полностью уничтожает время компиляции в C++, бесчисленные бесполезные зависимости причин (потому что определения классов в заголовочном файле представляют слишком много информации о реализации), и так далее.
В чем разница между этими двумя операторами
Первый возвращает отфильтрованную последовательность исходного / полного исходного объекта; второй по-прежнему выполняет фильтр, но возвращает последовательность анонимного типа с только с этими тремя свойствами.
Есть ли в этих заявлениях какие-либо проблемы, связанные с производительностью
Производительность зависит от серверной части. Если это LINQ-to-Objects, то с new {...}
вы создаете дополнительные объекты (анонимные типы) для каждой записи, поэтому могут возникнуть очень небольшие накладные расходы. Однако, если это LINQ-to-SQL и т. Д. (Серверная часть базы данных), то это может быть огромным преимуществом . Конструктор запросов проверит, какие столбцы необходимы, и выберет только три из вашего анонимного типа; если у вас (например) большой двоичный объект (или просто длинный varchar
) в ваших данных, который вам не нужен, это может быть огромным преимуществом.
Дополнительные примечания: вы не можете включать анонимные типы в сигнатуру метода, поэтому вы можете обнаружить, что для этой цели вам нужно объявить свой собственный тип DTO:
return new CustomerDto { Company = c.Company, Entered = c.Entered, PK = c.pk};
...
public class CustomerDto { ... }
Основное отличие состоит в том, что первый пример возвращает ссылки на существующие экземпляры, а второй пример создает новые экземпляры анонимного типа. Меня больше беспокоит эта проблема, чем любые возможные проблемы с производительностью.
Если есть сомнения, профиль.
Но да, я думаю, что это накладные расходы на производительность. Если вы сделаете , выберите c
, тогда коллекция будет содержать ссылки на исходные элементы. Если вы сделаете select new {...}
, то C # создает для вас анонимный тип, создавая новые экземпляры этого типа и заполняя их данными. Для меня это определенно медленнее.
Я провел несколько тестов (с использованием секундомера). Ни в одном случае анонимные типы не были быстрее, в Linq-to-SQL (против SQL Server), Linq-to-Entities (против MySQL) и Linq-to-Objects (против List). Фактически, обычно это было медленнее, в зависимости от того, сколько столбцов вы выбрали.
Один из моих результатов: Я выполнял каждый запрос 5000 раз для таблицы с 5 столбцами, заполненной 400 строками с помощью Linq-to-Entities.
анонимный объект (выбор 1 столбца): 17314 мс
анонимный объект (выбор 5 столбцов): 19193 мс
исходный объект: 16055 мс
В любом случае, лучший способ выяснить это - протестировать его самостоятельно (на написание хорошего сообщения уходит время).