1

我们将 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 的错误吗?

4

0 回答 0