在IQueryable上应用筛选器的Odata问题



我们正在努力在项目中实现最新的OData。我们正在使用EF Core,我们正在尝试使用自定义表达式函数作为映射器将域集映射到新的IQueryable of 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.

这是EF Core的错误。https://github.com/dotnet/efcore/issues/19087现在您可以将EF Core降级到2.2.6。3.1.4版的预期修复

最新更新