Я закончил с этим решением. Если кто-то видит ошибку или что-то, что нужно улучшить, я буду признателен за любые рекомендации.
public IQueryable<BalanceDTO> GetCollection()
{
var entities = dbContext.Balance;
var dtos = mapper.Map<ICollection<BalanceDTO>>(entities);
foreach(var _d in dtos)
{
_d.MonthSort = _d.Date.Month;
_d.MonthName = (new DateTimeFormatInfo()).GetMonthName(_d.MonthSort);
};
return dtos.AsQueryable();
}
public async Task<IList<BalanceDTO>> GetBalancesByYear(int year)
{
var entities = dbContext.Balance.Where(_d => _d.Date.Year == year).OrderBy(_d => _d.Date);
var balanceDTOs = Task<IList<BalanceDTO>>.Factory.StartNew(() =>
{
var dtos = mapper.Map<IList<BalanceDTO>>(entities);
foreach (var _d in dtos)
{
_d.MonthSort = _d.Date.Month;
_d.MonthName = (new DateTimeFormatInfo()).GetMonthName(_d.MonthSort);
};
return dtos;
});
return await balanceDTOs;
}
Я изменил GetBalancesByYear
, поэтому он не использует GetCollection
, так как он не будет быстродействующий, если ему нужно собрать полную коллекцию элементов и преобразовать их в DTO непосредственно перед фильтрацией того, что ему не нужно.
Я совершенно не понимаю, кто должен правильно создавать асинхронные c методы для моего DAL, когда они нужно вернуть DTO, а не только сущности.