我们正在尝试在我们的项目中实施最新的OData。我们正在使用EF Core,我们要尝试做的是使用自定义表达式函数作为映射器将域集映射到Dto模型的新IQueryable。应用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 opts。
[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);
}
预期结果 访问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.
答案 0 :(得分:0)
这是EF Core错误。 https://github.com/dotnet/efcore/issues/19087现在可以将EF Core降级到2.2.6。预期的版本3.1.4修复