How to use automapper to convert ODataQueryOptions<A> to ODataQueryOptions<B>

Viewed 138

How to use AutoMapper to convert ODataQueryOptions<A> to ODataQueryOptions<B>, where A is my DTO and B is my entity.

I need this to use the ApplyTo() method to generate the correct expression query. AutoMapper has a ProjectTo(), but it has issues when your DTO has a calculated property. In this case, if you pass a $top on the query string I get this issue:

System.InvalidOperationException: The LINQ expression 'DbSet<Summary>()
    .Where(s => !(s.IsDeleted))
    .OrderBy(s => s.Date)
    .ThenBy(s => s.Description)
    .ThenBy(s => s.TemperatureC)
    .ThenBy(s => new SummaryDto{ 
        Date = s.Date, 
        Description = s.Description, 
        TemperatureC = s.TemperatureC 
    }
    .TemperatureF)' could not be translated. 
Either rewrite the query in a form that can be translated, or switch to client evaluation explicitly by inserting a call to 'AsEnumerable', 'AsAsyncEnumerable', 'ToList', or 'ToListAsync'. 
See https://go.microsoft.com/fwlink/?linkid=2101038 for more information.

My Summary class looks like this:

public class Summary
{
    public string Description { get; set; }
    public int TemperatureC { get; set; }    
    public DateTime Date { get; set; }    
}

and the DTO SummaryDto:

public class SummaryDto
{
    public DateTime Date { get; set; }
    public string Description { get; set; }
    public int TemperatureC { get; set; }
    public int TemperatureF { get; set; }
}

I was trying to do this:

public async Task<DataSourceResult> GetSummaries(ODataQueryOptions<SummaryDto> oDataQueryOptions)
{
    IQueryable<Summary> summariesIQ = _summaryRepository.GetAll();
    IQueryable<SummaryDto> summaryDtoIQ = summariesIQ.ProjectTo<SummaryDto>(_mapper.ConfigurationProvider);
    var res2 = oDataQueryOptions.ApplyTo(summaryDtoIQ);

    var result = new DataSourceResult
    {
        Data = res2
    };

    return result;
}

My HTTP request is:

https://localhost:5001/api/weather_forecast?$top=1
0 Answers
Related