Wrong Binding $it range variable
Open
@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.
- OData spec http://docs.oasis-open.org/odata/odata/v4.01/odata-v4.01-part2-url-conventions.html#sec_it
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:

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
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Assessment
This issue has not been assessed yet.