Что выгодней для оптимизации: анонимный объект, объект или структура?
Имеется метод, который подсчитывает какое-то значение для каких-то сущностей. Для подсчёта значений производится выборки из бд целыми списками. Метод долго выполнялся и во время его рефакторинга у меня встал вопрос.
Например, у меня есть сущность Box с 30+ полями, из которых мне надо только Id (GUID виде string) и Date (DateTimeOffset?). Было это записано так:
var boxes = await _dbContext.Boxes.ToDictionaryAsync(x => x.Id, x => x.Date, token);
Уточню, что используется .NET Core версии 2.2.8 с Entity Framework Core.
Посмотрев SQL код в логах, заметил, что EF вытягивает все поля сущности в запросе. Оно-то и логично, наверное, но не очевидно. Дополнив данный запрос .Select() я сократил SQL SELECT до двух полей:
var boxes = await _dbContext.Boxes.Select(x => new { x.Id, x.Date })
.ToDictionaryAsync(x => x.Id, x => x.Date, token);
Вот мы и подошли к саму вопросу: во что будет выгодней, в плане производительности, поместить поля в Select'е, если "это" в дальнейшем будет преобразовано во что-то иное?.. Приведу ещё пример с KeyValuePair:
var boxes = await _dbContext.Boxes.Select(x => new KeyValuePair<string, DateTimeOffset?>(x.Id, x.Date))
.ToDictionaryAsync(x => x.Id, x => x.Date, token);
P.S. Понимаю, что это может оказаться крупицей в оптимизации, меня всё же интересует как быть конкретно в этой ситуации. Поспрашивал у коллег и ответы не были однозначными, поэтому спрашиваю тут.
И если бы был не Dictionary после Select'а, а какой-нибудь список/массив, то правильнее, наверное, было бы всё-таки использовать обычный объект, для лучшей читабельности кода и его поддержки другими программистами.