我们将 EF Core 3.1 与 OData 7.5.1 一起使用。我们还使用 DTO 和 Automapper 10.1.1 将我们的实体映射到这些 DTO。
我正在尝试使用以下查询仅扩展嵌套集合中的前几个项目:
https://localhost:44347/v1/odata/Subcategories?$top=3$expand=Products($top=2)
如果我在实体而不是 DTO 上运行此查询,则在 Expand 中添加的所有查询选项都可以正常工作。
但是,如果我们在 ProjectTo 之后的 DTO 上运行它,我会收到以下异常:
[为简洁而缩短]
System.InvalidOperationException: Processing of the LINQ expression '(ProjectionBindingExpression: 0)' by 'RelationalProjectionBindingExpressionVisitor' failed. This may indicate either a bug or a limitation in EF Core. See https://go.microsoft.com/fwlink/?linkid=2101433 for more detailed information.
at Microsoft.EntityFrameworkCore.Query.Internal.RelationalProjectionBindingExpressionVisitor.VisitExtension(Expression extensionExpression)
at System.Linq.Expressions.Expression.Accept(ExpressionVisitor visitor)
at Microsoft.EntityFrameworkCore.Query.Internal.RelationalProjectionBindingExpressionVisitor.Visit(Expression expression)
at System.Linq.Expressions.ExpressionVisitor.VisitConditional(ConditionalExpression node)
at System.Linq.Expressions.ConditionalExpression.Accept(ExpressionVisitor visitor)
at Microsoft.EntityFrameworkCore.Query.Internal.RelationalProjectionBindingExpressionVisitor.Visit(Expression expression)
at Microsoft.EntityFrameworkCore.Query.Internal.RelationalProjectionBindingExpressionVisitor.VisitMemberAssignment(MemberAssignment memberAssignment)
at System.Linq.Expressions.ExpressionVisitor.VisitMemberBinding(MemberBinding node)
at Microsoft.EntityFrameworkCore.Query.Internal.RelationalProjectionBindingExpressionVisitor.VisitMemberInit(MemberInitExpression memberInitExpression)
at System.Linq.Expressions.MemberInitExpression.Accept(ExpressionVisitor visitor)
at Microsoft.EntityFrameworkCore.Query.Internal.RelationalProjectionBindingExpressionVisitor.Visit(Expression expression)
所以,这行得通
[AllowAnonymous, HttpGet]
public async Task<IActionResult> Get(ODataQueryOptions<ProductSubcategoryDto> options)
{
IQueryable<ProductSubcategory> subs = DbContext.ProductSubcategories;
IQueryable queryable = options.ApplyTo(subs);
return Ok(queryable);
}
但是这个抛出
[AllowAnonymous, HttpGet]
public async Task<IActionResult> Get(ODataQueryOptions<ProductSubcategoryDto> options)
{
IQueryable<ProductSubcategoryDto> subsDto = DbContext.ProductSubcategories.ProjectTo<ProductSubcategoryDto>(Mapper.ConfigurationProvider);
IQueryable queryable = options.ApplyTo(subsDto);
return Ok(queryable);
}
而且我还尝试了 Queryable Extensions 和扩展中的查询选项被完全忽略,除了 $select。
[AllowAnonymous, HttpGet]
public async Task<IActionResult> Get(ODataQueryOptions<ProductSubcategoryDto> options)
{
return Ok(await DbContext.ProductSubcategories.GetQueryAsync(Mapper, options));
}
我们所有的 DTO 和 ProjectTo 调用在此上下文之外都可以正常工作。
我做的一切都是对的吗?这是 EF Core 或 Automapper 的错误吗?