У вас есть пара проблем, которые довольно легко исправить, разбить запрос на две половины: первую, чтобы запросить базу данных, и вернуть список частично заполненных CountryDTO, а вторая перебрать список, заполняющий отсутствующие элементы:
private async Task<List<CountryDTO>> GetCountriesDataAsync(int languageId)
{
int pageNo = 1, pageSize = 100;
var results = _dbContext.Countries // <- do not use await on db context
.Where(cc => cc.IsPublished.Equals(true)
&& cc.LanguageId.Equals(languageId))
.Select(co => new {
co.CountryId,
co.DisplayName,
co.PNGImageId,
co.SVGImageId
})
.Skip((pageNo - 1) * pageSize) // <- use page size no 100
.Take(pageSize)
.ToListAsync();
var images = await _cacheService.GetAllAsync("imagesCacheKey");
return Task.FromResult( results.Select(co => new CountryDTO
{
Uuid = co.CountryId,
PNGImagePath = images.FirstOrDefault(im => im.ImageId.Equals(co.PNGImageId))?.FilePath, // <- could be null so use ?.FilePath
SVGImagePath = images.FirstOrDefault(im => im.ImageId.Equals(co.SVGImageId))?.FilePath,
DisplayName = co.DisplayName,
DisplayNameShort = co.DisplayName,
Name = Helper.ReplaceChars(co.DisplayName),
Path = Helper.ReplaceChars(co.DisplayName),
CompleteResponse = true
}).ToList());
}
Я создал анонимный тип для хранения возврата из базы данных, в отличие от добавления дополнительного поля в DTO для идентификаторов изображений и тому подобного. если вам нужно больше из базы данных, просто добавьте поля к анонимному типу в операторе выбора контекста.