Проблема Odata с применением фильтра на IQueryable - PullRequest
1 голос
/ 12 марта 2020

Мы пытаемся внедрить новейшие 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.

1 Ответ

0 голосов
/ 13 марта 2020

Это ошибка EF Core. https://github.com/dotnet/efcore/issues/19087 на данный момент вы можете понизить EF Core до 2.2.6. Ожидаемое исправление с версией 3.1.4

...