Мы пытаемся внедрить новейшие OData в наш проект. Мы используем EF Core, и то, что мы пытаемся сделать, это сопоставить набор доменов с новым IQueryable из Dto Models, используя пользовательскую функцию выражения в качестве преобразователя. После применения фильтров OData запрос прерывается и не может быть выполнен.
Затронутые сборки
Microsoft.AspNetCore.OData v7.3.0
Microsoft.EntityFrameworkCore v3.1.2
.Net Core 3.1 WebApi Project
Воспроизведение шагов IQueryable, возвращаемых в контроллере
_dbContext.PurchaseTypes.Select(Mapper.ToDto())
Функция выражения, используемая для отображения
public static Expression<Func<PurchaseType, PurchaseTypeDto>> ToDto()
{
return domain => new PurchaseTypeDto
{
Id = domain.Id,
Code = domain.Code
};
}
В контроллере у нас есть вызов службы (который возвращает IQueryable), и мы применяем опции ODataQueryOptions.
[HttpGet]
public async Task<IActionResult> Get(ODataQueryOptions<PurchaseTypeDto> opts)
{
var query = opts.ApplyTo(_purchaseTypeService.GetAll()) as Queryable<PurchaseTypeDto>;
var result = await query.ToListAsync();
return Ok(result);
}
Ожидаемый результат, когда URL доступен https://localhost: 44361 / odata / PurchaseType?% 24filter = Id% 20eq% 202 , выполнить запрос, и результат будет возвращен
Фактический результат Невозможно выполнить созданный запрос
InvalidOperationException: The LINQ expression
'DbSet
.Where(p => new PurchaseTypeDto(
p.Id,
p.Code
).Id == __TypedProperty_0)'
could not be translated.