diff --git a/src/Microsoft.OData.Client/ProjectionPlanCompiler.cs b/src/Microsoft.OData.Client/ProjectionPlanCompiler.cs index 72d90127fa..b52ca674a6 100644 --- a/src/Microsoft.OData.Client/ProjectionPlanCompiler.cs +++ b/src/Microsoft.OData.Client/ProjectionPlanCompiler.cs @@ -811,7 +811,8 @@ private Expression GetDeepestEntry(Expression[] path) result = CallMaterializer( nameof(ODataEntityMaterializerInvoker.ProjectionGetEntry), result ?? this.pathBuilder.ParameterEntryInScope, - Expression.Constant(((MemberExpression)path[pathIndex]).Member.Name, typeof(string))); + Expression.Constant(((MemberExpression)path[pathIndex]).Member.Name, typeof(string)), + Expression.Constant(this.materializerContext)); pathIndex++; } while (pathIndex < path.Length); diff --git a/test/EndToEndTests/Tests/Client/AsynchronousTests/AsynchronousQueryTests.cs b/test/EndToEndTests/Tests/Client/AsynchronousTests/AsynchronousQueryTests.cs index 7bff3e1619..4e014406da 100644 --- a/test/EndToEndTests/Tests/Client/AsynchronousTests/AsynchronousQueryTests.cs +++ b/test/EndToEndTests/Tests/Client/AsynchronousTests/AsynchronousQueryTests.cs @@ -797,6 +797,8 @@ public async Task Linq_ProjectPropertiesFromEntityWithConditionalNullCheckOnExpa .Select(c => new Computer { ComputerId = c.ComputerId, + // this contrived expression is to get the plan compiler to perform + // a null check against an expanded entity ComputerDetail = c.ComputerDetail == null ? null : c.ComputerDetail, }) as DataServiceQuery; @@ -807,6 +809,38 @@ public async Task Linq_ProjectPropertiesFromEntityWithConditionalNullCheckOnExpa Assert.Equal(-10, computer.ComputerDetail.ComputerDetailId); } + [Fact] + public async Task Linq_ProjectPropertiesFromNestedExpandedEntityToADifferentTargetTypeFromTheSource() + { + var context = this.CreateWrappedContext().Context; + var query = context.ComputerDetail.Where(c => c.ComputerDetailId == -10) + .Select(c => new Computer + { + ComputerId = c.Computer.ComputerId, + }) as DataServiceQuery; + + var result = await query.ExecuteAsync(); + + var computer = result.First(); + Assert.Equal(-10, computer.ComputerId); + } + + [Fact] + public async Task Linq_ProjectPropertiesFromNestedComplexTypeToADifferentTargetTypeFromTheSource() + { + var context = this.CreateWrappedContext().Context; + var query = context.Customer.Where(c => c.CustomerId == -10) + .Select(c => new ContactDetails + { + HomePhone = c.PrimaryContactInfo.HomePhone + }) as DataServiceQuery; + + var result = await query.ExecuteAsync(); + + var contactDetails = result.First(); + Assert.Equal("jqjklhnnkyhujailcedbguyectpuamgbghreatqvobbtj", contactDetails.HomePhone.Extension); + } + /// /// LINQ query Project Name Stream Property ///