OData / OData/AspNetCoreOData

Wrong Binding $it range variable

Open
#375 1 comment 0 reactions 2 assignees View on GitHub

@xuzhg is already working on this.

Since Nov 16, 2021.

bug
Dominant language
C#
Stars
505
Forks
186
PR merge metrics
No merged PRs in 30d

Description

Short summary (3-5 sentences) describing the issue.

Example 106: customers along with their orders that shipped to the same city as the customer's address. The nested filter expression is evaluated in the context of Orders; $it allows referring to values in the outer context of Customers.

http://host/service/Customers?$expand=Orders($filter=$it/Address/City eq ShipTo/City)

ODL query option parser the nested $filter as:


FilterClause: RangeVariable (name: "$it", type: "Order")

  --- Expression: BinaryOperatorNode
                   --- Left:   SinglePropertyAccessNode
                                                 --- Source: (RangeVariableReferenceNode) (name: "$it", type: "Customer")

                   --- Right:   SinglePropertyAccessNode
                                                 --- Source: (RangeVariableReferenceNode) (name: "$it", type: "Order")

You can see the nested $filter has three range variables related, all named "$it".

When we do the bind, it tries to get the "$it" parameter when do the left, as the following debug:

image

Then, here's the example:

System.ArgumentException: Instance property 'xxxx' is not defined for type 'AspNetCore3xEndpointSample.Web.Models.Order' (Parameter 'propertyName')
 at System.Linq.Expressions.Expression.Property(Expression expression, String propertyName)
   at Microsoft.AspNet.OData.Query.Expressions.ExpressionBinderBase.GetPropertyExpression(Expression source, String propertyPath) in D:\github\odata\WebApi\src\Microsoft.AspNet.OData.Shared\Query\Expressions\ExpressionBinderBase.cs:line 1189
   at Microsoft.AspNet.OData.Query.Expressions.ExpressionBinderBase.CreatePropertyAccessExpression(Expression source, IEdmProperty property, String propertyPath) in D:\github\odata\WebApi\src\Microsoft.AspNet.OData.Shared\Query\Expressions\ExpressionBinderBase.cs:line 1178
   at Microsoft.AspNet.OData.Query.Expressions.FilterBinder.BindPropertyAccessQueryNode(SingleValuePropertyAccessNode propertyAccessNode) in D:\github\odata\WebApi\src\Microsoft.AspNet.OData.Shared\Query\Expressions\FilterBinder.cs:line 681
   at Microsoft.AspNet.OData.Query.Expressions.FilterBinder.BindSingleValueNode(SingleValueNode node) in D:\github\odata\WebApi\src\Microsoft.AspNet.OData.Shared\Query\Expressions\FilterBinder.cs:line 856
   at Microsoft.AspNet.OData.Query.Expressions.FilterBinder.Bind(QueryNode node) in D:\github\odata\WebApi\src\Microsoft.AspNet.OData.Shared\Query\Expressions\FilterBinder.cs:line 203
   at Microsoft.AspNet.OData.Query.Expressions.FilterBinder.BindBinaryOperatorNode(BinaryOperatorNode binaryOperatorNode) in D:\github\odata\WebApi\src\Microsoft.AspNet.OData.Shared\Query\Expressions\FilterBinder.cs:line 502
   at Microsoft.AspNet.OData.Query.Expressions.FilterBinder.BindSingleValueNode(SingleValueNode node) in D:\github\odata\WebApi\src\Microsoft.AspNet.OData.Shared\Query\Expressions\FilterBinder.cs:line 841
   at Microsoft.AspNet.OData.Query.Expressions.FilterBinder.Bind(QueryNode node) in D:\github\odata\WebApi\src\Microsoft.AspNet.OData.Shared\Query\Expressions\FilterBinder.cs:line 203
   at Microsoft.AspNet.OData.Query.Expressions.FilterBinder.BindExpression(SingleValueNode expression, RangeVariable rangeVariable, Type elementType) in D:\github\odata\WebApi\src\Microsoft.AspNet.OData.Shared\Query\Expressions\FilterBinder.cs:line 602
   at Microsoft.AspNet.OData.Query.Expressions.FilterBinder.BindFilterClause(FilterBinder binder, FilterClause filterClause, Type filterType) in D:\github\odata\WebApi\src\Microsoft.AspNet.OData.Shared\Query\Expressions\FilterBinder.cs:line 165
   at Microsoft.AspNet.OData.Query.Expressions.FilterBinder.Bind(IQueryable baseQuery, FilterClause filterClause, Type filterType, ODataQueryContext context, ODataQuerySettings querySettings) in D:\github\odata\WebApi\src\Microsoft.AspNet.OData.Shared\Query\Expressions\FilterBinder.cs:line 81
   at Microsoft.AspNet.OData.Query.Expressions.SelectExpandBinder.CreatePropertyValueExpression(IEdmStructuredType elementType, IEdmProperty property, Expression source, FilterClause filterClause) in D:\github\odata\WebApi\src\Microsoft.AspNet.OData.Shared\Query\Expressions\SelectExpandBinder.cs:line 210
   at Microsoft.AspNet.OData.Query.Expressions.SelectExpandBinder.BuildExpandedProperty(Expression source, IEdmStructuredType structuredType, IEdmNavigationProperty navigationProperty, ExpandedReferenceSelectItem expandedItem, IList`1 includedProperties) in D:\github\odata\WebApi\src\Microsoft.AspNet.OData.Shared\Query\Expressions\SelectExpandBinder.cs:line 711
   at Microsoft.AspNet.OData.Query.Expressions.SelectExpandBinder.BuildPropertyContainer(Expression source, IEdmStructuredType structuredType, IDictionary`2 propertiesToExpand, IDictionary`2 propertiesToInclude, ISet`1 autoSelectedProperties, Boolean isSelectingOpenTypeSegments) in D:\github\odata\WebApi\src\Microsoft.AspNet.OData.Shared\Query\Expressions\SelectExpandBinder.cs:line 643
   at Microsoft.AspNet.OData.Query.Expressions.SelectExpandBinder.ProjectElement(Expression source, SelectExpandClause selectExpandClause, IEdmStructuredType structuredType, IEdmNavigationSource navigationSource) in D:\github\odata\WebApi\src\Microsoft.AspNet.OData.Shared\Query\Expressions\SelectExpandBinder.cs:line 336
   at Microsoft.AspNet.OData.Query.Expressions.SelectExpandBinder.GetProjectionLambda(SelectExpandQueryOption selectExpandQuery) in D:\github\odata\WebApi\src\Microsoft.AspNet.OData.Shared\Query\Expressions\SelectExpandBinder.cs:line 98

Contributor guide

No contributing guide indexed for this repository

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.