Что выгодней для оптимизации: анонимный объект, объект или структура?

Имеется метод, который подсчитывает какое-то значение для каких-то сущностей. Для подсчёта значений производится выборки из бд целыми списками. Метод долго выполнялся и во время его рефакторинга у меня встал вопрос.

Например, у меня есть сущность 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'а, а какой-нибудь список/массив, то правильнее, наверное, было бы всё-таки использовать обычный объект, для лучшей читабельности кода и его поддержки другими программистами.


Ответы (0 шт):