Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Query: Projection with nested query fails with crashing SQL query #6824

Closed
FransBouma opened this issue Oct 20, 2016 · 3 comments
Closed

Query: Projection with nested query fails with crashing SQL query #6824

FransBouma opened this issue Oct 20, 2016 · 3 comments
Assignees
Labels
closed-fixed The issue has been fixed and is/will be included in the release indicated by the issue milestone. type-bug
Milestone

Comments

@FransBouma
Copy link

FransBouma commented Oct 20, 2016

Steps to reproduce

My designer allows the creation of models derived from entity models, containing derived elements. These Derived Elements are hierarchical DTO elements (or hierarchical document definitions for document databases) with (potentially) denormalized fields. These models are generated as POCOs and accompanying Linq projection methods to project a normal IQueryable to the desired derived element.

A query which should project a Northwind Customer - Order - Employee hierarchy to a hierarchy of DTO objects fails with a SQL query that has invalid fields. The root cause is likely the DefaultIfEmpty() that's been executed in memory, according to the log this is happening, however the Linq query doesn't contain any DefaultIfEmpty call.

The issue

Query run:

var results = new NorthwindEFCoreDataContext().Customers.ProjectToCustomerOrder().ToList();

ProjectToCustomerOrder() is: (I'm giving the whole projection class so there are no hidden artificats)

/// <summary>Static class for (extension) methods for fetching and projecting instances of NWEFCore.Dtos.DtoClasses.CustomerOrder from / to the entity model.</summary>
public static partial class CustomerOrderPersistence
{
    #region Statics
    private static readonly System.Linq.Expressions.Expression<Func<NWEFCore.EntityClasses.Customer, NWEFCore.Dtos.DtoClasses.CustomerOrder>> _projectorExpression = CreateProjectionFunc();
    private static readonly Func<NWEFCore.EntityClasses.Customer, NWEFCore.Dtos.DtoClasses.CustomerOrder> _compiledProjector = CreateProjectionFunc().Compile();
    #endregion  

    /// <summary>Empty static ctor for triggering initialization of static members in a thread-safe manner</summary>
    static CustomerOrderPersistence()
    {
    }

    /// <summary>Extension method which produces a projection to NWEFCore.Dtos.DtoClasses.CustomerOrder which instances are projected from the 
    /// results of the specified baseQuery, which returns NWEFCore.EntityClasses.Customer instances, the root entity of the derived element returned by this query.</summary>
    /// <param name="baseQuery">The base query to project the derived element instances from.</param>
    /// <returns>IQueryable to retrieve NWEFCore.Dtos.DtoClasses.CustomerOrder instances</returns>
    public static IQueryable<NWEFCore.Dtos.DtoClasses.CustomerOrder> ProjectToCustomerOrder(this IQueryable<NWEFCore.EntityClasses.Customer> baseQuery)
    {
        return baseQuery.Select(_projectorExpression);
    }


    /// <summary>Extension method which produces a projection to NWEFCore.Dtos.DtoClasses.CustomerOrder which instances are projected from the
    /// NWEFCore.EntityClasses.Customer entity instance specified, the root entity of the derived element returned by this method.</summary>
    /// <param name="entity">The entity to project from.</param>
    /// <returns>NWEFCore.EntityClasses.Customer instance created from the specified entity instance</returns>
    public static NWEFCore.Dtos.DtoClasses.CustomerOrder ProjectToCustomerOrder(this NWEFCore.EntityClasses.Customer entity)
    {
        return _compiledProjector(entity);
    }


    private static System.Linq.Expressions.Expression<Func<NWEFCore.EntityClasses.Customer, NWEFCore.Dtos.DtoClasses.CustomerOrder>> CreateProjectionFunc()
    {
        return p__0 => new NWEFCore.Dtos.DtoClasses.CustomerOrder()
        {
            CompanyName = p__0.CompanyName,
            CustomerId = p__0.CustomerId,
            Orders = p__0.Orders.Select(p__1 => new NWEFCore.Dtos.DtoClasses.CustomerOrderTypes.Order()
            {
                Employee = new NWEFCore.Dtos.DtoClasses.CustomerOrderTypes.OrderTypes.Employee()
                {
                    FirstName = p__1.Employee.FirstName,
                    LastName = p__1.Employee.LastName,
                },
                OrderDate = p__1.OrderDate,
                OrderId = p__1.OrderId,
            }).ToList(),
        };
    }
//...
}

The DTOs:

//------------------------------------------------------------------------------
// <auto-generated>This code was generated by LLBLGen Pro v5.1.</auto-generated>
//------------------------------------------------------------------------------
using System;
using System.ComponentModel;
using System.Collections.Specialized;
using System.Collections.Generic;

namespace NWEFCore.Dtos.DtoClasses
{ 
    /// <summary> DTO class which is derived from the entity 'Customer'.</summary>
    public partial class CustomerOrder
    {
        /// <summary>Gets or sets the CompanyName field. Derived from Entity Model Field 'Customer.CompanyName'</summary>
        public System.String CompanyName { get; set; }
        /// <summary>Gets or sets the CustomerId field. Derived from Entity Model Field 'Customer.CustomerId'</summary>
        public System.String CustomerId { get; set; }
        /// <summary>Gets or sets the Orders field. </summary>
        public List<CustomerOrderTypes.Order> Orders { get; set; }
    }

    namespace CustomerOrderTypes
    {
        /// <summary> DTO class which is derived from the entity 'Order (Orders)'.</summary>
        public partial class Order
        {
            /// <summary>Gets or sets the Employee field. </summary>
            public OrderTypes.Employee Employee { get; set; }
            /// <summary>Gets or sets the OrderDate field. Derived from Entity Model Field 'Order.OrderDate'</summary>
            public Nullable<System.DateTime> OrderDate { get; set; }
            /// <summary>Gets or sets the OrderId field. Derived from Entity Model Field 'Order.OrderId'</summary>
            public System.Int32 OrderId { get; set; }
        }

        namespace OrderTypes
        {
            /// <summary> DTO class which is derived from the entity 'Employee (Orders.Employee)'.</summary>
            public partial class Employee
            {
                /// <summary>Gets or sets the FirstName field. Derived from Entity Model Field 'Employee.FirstName'</summary>
                public System.String FirstName { get; set; }
                /// <summary>Gets or sets the LastName field. Derived from Entity Model Field 'Employee.LastName'</summary>
                public System.String LastName { get; set; }
            }
        }
    }

}

Full log with exception, query and stacktrace:

System.Data.SqlClient.SqlException : Invalid column name 'CompanyName'.
   at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
   at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
   at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)
   at System.Data.SqlClient.SqlDataReader.TryConsumeMetaData()
   at System.Data.SqlClient.SqlDataReader.get_MetaData()
   at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString, Boolean isInternal, Boolean forDescribeParameterEncryption)
   at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 timeout, Task& task, Boolean asyncWrite, Boolean inRetry, SqlDataReader ds, Boolean describeParameterEncryptionRequest)
   at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, TaskCompletionSource`1 completion, Int32 timeout, Task& task, Boolean& usedCache, Boolean asyncWrite, Boolean inRetry)
   at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method)
   at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method)
   at Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommand.Execute(IRelationalConnection connection, String executeMethod, IReadOnlyDictionary`2 parameterValues, Boolean openConnection, Boolean closeConnection)
   at Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommand.ExecuteReader(IRelationalConnection connection, IReadOnlyDictionary`2 parameterValues, Boolean manageConnection)
   at Microsoft.EntityFrameworkCore.Query.Internal.QueryingEnumerable.Enumerator.MoveNext()
   at Microsoft.EntityFrameworkCore.Query.QueryMethodProvider.<_GroupJoin>d__26`4.MoveNext()
   at System.Linq.Enumerable.<SelectManyIterator>d__22`3.MoveNext()
   at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
   at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
   at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
   at lambda_method(Closure , ValueBuffer )
   at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
   at Microsoft.EntityFrameworkCore.Query.Internal.LinqOperatorProvider.ExceptionInterceptor`1.EnumeratorExceptionInterceptor.MoveNext()
   at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
   at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
   at EFCoreTester.SimpleDTOTestsCodeFirst.CustomerOrder_SimpleFetchAll() in C:\Myprojects\VS.NET Projects\LLBLGen Pro v5.1\UnitTests\EntityFramework\EFCoreTester\SimpleDTOTestsCodeFirst.cs:line 112

Compiling query model: 'from Customer p__0 in value(Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable`1[NWEFCore.EntityClasses.Customer]) select new CustomerOrder() {CompanyName = [p__0].CompanyName, CustomerId = [p__0].CustomerId, Orders = {from Order p__1 in [p__0].Orders select new Order() {Employee = new Employee() {FirstName = [p__1].Employee.FirstName, LastName = [p__1].Employee.LastName}, OrderDate = [p__1].OrderDate, OrderId = [p__1].OrderId}}.ToList()}'
Optimized query model: 'from Customer p__0 in value(Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable`1[NWEFCore.EntityClasses.Customer]) select new CustomerOrder() {CompanyName = [p__0].CompanyName, CustomerId = [p__0].CustomerId, Orders = {from Order p__1 in value(Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable`1[NWEFCore.EntityClasses.Order]) join Employee p__1.Employee in value(Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable`1[NWEFCore.EntityClasses.Employee]) on IIF(([p__1] != null), Property([p__1], "EmployeeID"), null) equals Convert(Property([p__1.Employee], "EmployeeId")) into IEnumerable`1 p__1.Employee_group from Employee p__1.Employee in {[p__1.Employee_group] => DefaultIfEmpty()} where (Property([p__0], "CustomerId") == Property([p__1], "CustomerID")) select new Order() {Employee = new Employee() {FirstName = IIF(([p__1.Employee] != null), [p__1.Employee].FirstName, null), LastName = IIF(([p__1.Employee] != null), [p__1.Employee].LastName, null)}, OrderDate = [p__1].OrderDate, OrderId = [p__1].OrderId}}.ToList()}'
The LINQ expression 'DefaultIfEmpty()' could not be translated and will be evaluated locally. To configure this warning use the DbContextOptionsBuilder.ConfigureWarnings API (event id 'RelationalEventId.QueryClientEvaluationWarning'). ConfigureWarnings can be used when overriding the DbContext.OnConfiguring method or using AddDbContext on the application service provider.
The LINQ expression 'DefaultIfEmpty()' could not be translated and will be evaluated locally. To configure this warning use the DbContextOptionsBuilder.ConfigureWarnings API (event id 'RelationalEventId.QueryClientEvaluationWarning'). ConfigureWarnings can be used when overriding the DbContext.OnConfiguring method or using AddDbContext on the application service provider.
The LINQ expression 'from Employee p__1.Employee in {[p__1.Employee_group] => DefaultIfEmpty()}' could not be translated and will be evaluated locally. To configure this warning use the DbContextOptionsBuilder.ConfigureWarnings API (event id 'RelationalEventId.QueryClientEvaluationWarning'). ConfigureWarnings can be used when overriding the DbContext.OnConfiguring method or using AddDbContext on the application service provider.
The LINQ expression '(Property([p__0], "CustomerId") == Property([p__1], "CustomerID"))' could not be translated and will be evaluated locally. To configure this warning use the DbContextOptionsBuilder.ConfigureWarnings API (event id 'RelationalEventId.QueryClientEvaluationWarning'). ConfigureWarnings can be used when overriding the DbContext.OnConfiguring method or using AddDbContext on the application service provider.
TRACKED: False
(QueryContext queryContext) => IEnumerable<CustomerOrder> _Select(
    source: IEnumerable<ValueBuffer> _ShapedQuery(
        queryContext: queryContext, 
        shaperCommandContext: SelectExpression: 
            SELECT [p__0].[CompanyName], [p__0].[CustomerID]
            FROM [dbo].[Customers] AS [p__0]
        , 
        shaper: ValueBufferShaper
    )
    , 
    selector: (ValueBuffer p__0) => new CustomerOrder{ 
        (string) object p__0.get_Item(0)CompanyName = Convert(p__0.get_Item(0)), 
        (string) object p__0.get_Item(1)CustomerId = Convert(p__0.get_Item(1)), 
        List<Order> ToList(
            source: IEnumerable<Order> _Select(
                source: IEnumerable<TransparentIdentifier<TransparentIdentifier<Order, IEnumerable<Employee>>, Employee>> _Where(
                    source: IEnumerable<TransparentIdentifier<TransparentIdentifier<Order, IEnumerable<Employee>>, Employee>> _SelectMany(
                        source: IEnumerable<TransparentIdentifier<Order, IEnumerable<Employee>>> _GroupJoin(
                            queryContext: (RelationalQueryContext) queryContext, 
                            source: IEnumerable<ValueBuffer> _Query(
                                queryContext: queryContext, 
                                shaperCommandContext: SelectExpression: 
                                    SELECT [p__1].[OrderID], [p__1].[CompanyName], [p__1].[CustomerID], [p__1].[EmployeeID], [p__1].[Freight], [p__1].[OrderDate], [p__1].[RequiredDate], [p__1].[ShipAddress], [p__1].[ShipCity], [p__1].[ShipCountry], [p__1].[ShipName], [p__1].[ShipPostalCode], [p__1].[ShipRegion], [p__1].[ShipVia], [p__1].[ShippedDate], [p__1.Employee].[EmployeeID], [p__1.Employee].[Address], [p__1.Employee].[City], [p__1.Employee].[Region], [p__1.Employee].[BirthDate], [p__1.Employee].[Country], [p__1.Employee].[Extension], [p__1.Employee].[FirstName], [p__1.Employee].[HireDate], [p__1.Employee].[HomePhone], [p__1.Employee].[LastName], [p__1.Employee].[Notes], [p__1.Employee].[Photo], [p__1.Employee].[PhotoPath], [p__1.Employee].[PostalCode], [p__1.Employee].[RegionID], [p__1.Employee].[ReportsTo], [p__1.Employee].[Title], [p__1.Employee].[TitleOfCourtesy]
                                    FROM [dbo].[Orders] AS [p__1]
                                    LEFT JOIN [dbo].[Employees] AS [p__1.Employee] ON [p__1].[EmployeeID] = [p__1.Employee].[EmployeeID]
                                    ORDER BY [p__1].[EmployeeID]
                                , 
                                queryIndex: default(System.Nullable`1[System.Int32])
                            )
                            , 
                            outerShaper: BufferedEntityShaper<Order>, 
                            innerShaper: BufferedOffsetEntityShaper<Employee>, 
                            innerKeySelector: (Employee p__1.Employee) => (Nullable<int>) int GetValue(
                                queryContext: queryContext, 
                                entity: p__1.Employee, 
                                property: EmployeeId
                            )
                            , 
                            resultSelector: (Order p__1 | IEnumerable<Employee> p__1.Employee_group) => TransparentIdentifier<Order, IEnumerable<Employee>> CreateTransparentIdentifier(
                                outer: p__1, 
                                inner: p__1.Employee_group
                            )
                            , 
                            outerGroupJoinInclude: default(Internal.GroupJoinInclude), 
                            innerGroupJoinInclude: default(Internal.GroupJoinInclude)
                        )
                        , 
                        collectionSelector: (TransparentIdentifier<Order, IEnumerable<Employee>> t0) => IEnumerable<Employee> DefaultIfEmpty(
                            source: t0.Inner
                        )
                        , 
                        resultSelector: (TransparentIdentifier<Order, IEnumerable<Employee>> t0 | Employee p__1.Employee) => TransparentIdentifier<TransparentIdentifier<Order, IEnumerable<Employee>>, Employee> CreateTransparentIdentifier(
                            outer: t0, 
                            inner: p__1.Employee
                        )
                    )
                    , 
                    predicate: (TransparentIdentifier<TransparentIdentifier<Order, IEnumerable<Employee>>, Employee> t1) => (string) object p__0.get_Item(1) == string GetValue(
                        queryContext: queryContext, 
                        entity: t1.Outer.Outer, 
                        property: CustomerID
                    )
                )
                , 
                selector: (TransparentIdentifier<TransparentIdentifier<Order, IEnumerable<Employee>>, Employee> t1) => new Order{ 
                    new Employee{ 
                        t1.Inner != null ? t1.Inner.FirstName : nullFirstName = IIF((t1.Inner != null), t1.Inner.FirstName, null), 
                        t1.Inner != null ? t1.Inner.LastName : nullLastName = IIF((t1.Inner != null), t1.Inner.LastName, null) 
                    }
                    Employee = new Employee() {FirstName = IIF((t1.Inner != null), t1.Inner.FirstName, null), LastName = IIF((t1.Inner != null), t1.Inner.LastName, null)}, 
                    t1.Outer.Outer.OrderDateOrderDate = t1.Outer.Outer.OrderDate, 
                    t1.Outer.Outer.OrderIdOrderId = t1.Outer.Outer.OrderId 
                }
            )
        )
        Orders = _Select(_Where(_SelectMany(_GroupJoin(Convert(queryContext), _Query(queryContext, value(Internal.ShaperCommandContext), default(Nullable`1)), BufferedEntityShaper<Order>, BufferedOffsetEntityShaper<Employee>, p__1.Employee => Convert(GetValue(queryContext, p__1.Employee, value(Metadata.Internal.Property))), (p__1, p__1.Employee_group) => CreateTransparentIdentifier(p__1, p__1.Employee_group), default(GroupJoinInclude), default(GroupJoinInclude)), t0 => t0.Inner.DefaultIfEmpty(), (t0, p__1.Employee) => CreateTransparentIdentifier(t0, p__1.Employee)), t1 => (Convert(p__0.get_Item(1)) == GetValue(queryContext, t1.Outer.Outer, value(Metadata.Internal.Property)))), t1 => new Order() {Employee = new Employee() {FirstName = IIF((t1.Inner != null), t1.Inner.FirstName, null), LastName = IIF((t1.Inner != null), t1.Inner.LastName, null)}, OrderDate = t1.Outer.Outer.OrderDate, OrderId = t1.Outer.Outer.OrderId}).ToList() 
    }
)

Opening connection to database 'Northwind2' on server 'nerd.sd.local'.
Executed DbCommand (12ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
SELECT [p__0].[CompanyName], [p__0].[CustomerID]
FROM [dbo].[Customers] AS [p__0]
Executed DbCommand (1ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
SELECT [p__1].[OrderID], [p__1].[CompanyName], [p__1].[CustomerID], [p__1].[EmployeeID], [p__1].[Freight], [p__1].[OrderDate], [p__1].[RequiredDate], [p__1].[ShipAddress], [p__1].[ShipCity], [p__1].[ShipCountry], [p__1].[ShipName], [p__1].[ShipPostalCode], [p__1].[ShipRegion], [p__1].[ShipVia], [p__1].[ShippedDate], [p__1.Employee].[EmployeeID], [p__1.Employee].[Address], [p__1.Employee].[City], [p__1.Employee].[Region], [p__1.Employee].[BirthDate], [p__1.Employee].[Country], [p__1.Employee].[Extension], [p__1.Employee].[FirstName], [p__1.Employee].[HireDate], [p__1.Employee].[HomePhone], [p__1.Employee].[LastName], [p__1.Employee].[Notes], [p__1.Employee].[Photo], [p__1.Employee].[PhotoPath], [p__1.Employee].[PostalCode], [p__1.Employee].[RegionID], [p__1.Employee].[ReportsTo], [p__1.Employee].[Title], [p__1.Employee].[TitleOfCourtesy]
FROM [dbo].[Orders] AS [p__1]
LEFT JOIN [dbo].[Employees] AS [p__1.Employee] ON [p__1].[EmployeeID] = [p__1.Employee].[EmployeeID]
ORDER BY [p__1].[EmployeeID]
An exception occurred in the database while iterating the results of a query.
System.Data.SqlClient.SqlException (0x80131904): Invalid column name 'CompanyName'.
   at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
   at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
   at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)
   at System.Data.SqlClient.SqlDataReader.TryConsumeMetaData()
   at System.Data.SqlClient.SqlDataReader.get_MetaData()
   at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString, Boolean isInternal, Boolean forDescribeParameterEncryption)
   at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 timeout, Task& task, Boolean asyncWrite, Boolean inRetry, SqlDataReader ds, Boolean describeParameterEncryptionRequest)
   at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, TaskCompletionSource`1 completion, Int32 timeout, Task& task, Boolean& usedCache, Boolean asyncWrite, Boolean inRetry)
   at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method)
   at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method)
   at Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommand.Execute(IRelationalConnection connection, String executeMethod, IReadOnlyDictionary`2 parameterValues, Boolean openConnection, Boolean closeConnection)
   at Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommand.ExecuteReader(IRelationalConnection connection, IReadOnlyDictionary`2 parameterValues, Boolean manageConnection)
   at Microsoft.EntityFrameworkCore.Query.Internal.QueryingEnumerable.Enumerator.MoveNext()
   at Microsoft.EntityFrameworkCore.Query.QueryMethodProvider.<_GroupJoin>d__26`4.MoveNext()
   at System.Linq.Enumerable.<SelectManyIterator>d__22`3.MoveNext()
   at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
   at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
   at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
   at lambda_method(Closure , ValueBuffer )
   at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
   at Microsoft.EntityFrameworkCore.Query.Internal.LinqOperatorProvider.ExceptionInterceptor`1.EnumeratorExceptionInterceptor.MoveNext()
ClientConnectionId:811d70b7-fae6-4cba-ae42-d27bc14942cd
Error Number:207,State:1,Class:16

Further technical details

EF Core version: 1.0.1
Operating system: Windows 8.1
Visual Studio version: 2015

@rowanmiller rowanmiller added this to the 1.2.0 milestone Oct 24, 2016
@maumar
Copy link
Contributor

maumar commented Nov 16, 2016

This works in the current bits, we produce the following query plan:

TRACKED: False
(QueryContext queryContext) => IEnumerable<CustomerOrderDto> _Select(
    source: IEnumerable<ValueBuffer> _ShapedQuery(
        queryContext: queryContext, 
        shaperCommandContext: SelectExpression: 
            SELECT [c].[CompanyName], [c].[CustomerId]
            FROM [Customers] AS [c]
        , 
        shaper: ValueBufferShaper
    )
    , 
    selector: (ValueBuffer c) => new CustomerOrderDto{ 
        try { (string) object c.get_Item(0) } catch (Exception) { ... } CompanyName = try { ... }, 
        try { (string) object c.get_Item(1) } catch (Exception) { ... } CustomerId = try { ... }, 
        List<OrderDto> ToList(
            source: IEnumerable<OrderDto> _Select(
                source: IEnumerable<TransparentIdentifier<ValueBuffer, Employee>> _InjectParameters(
                    queryContext: queryContext, 
                    source: IEnumerable<TransparentIdentifier<ValueBuffer, Employee>> _ShapedQuery(
                        queryContext: queryContext, 
                        shaperCommandContext: SelectExpression: 
                            SELECT [o.Employee].[EmployeeId], [o.Employee].[FirstName], [o.Employee].[LastName], [o].[OrderDate], [o].[OrderId]
                            FROM [Orders] AS [o]
                            LEFT JOIN [Employees] AS [o.Employee] ON [o].[EmployeeId] = [o.Employee].[EmployeeId]
                            WHERE @_outer_CustomerId = [o].[CustomerId]
                        , 
                        shaper: CompositeShaper`3
                    )
                    , 
                    parameterNames: new string[]{ "_outer_CustomerId" }
                    , 
                    parameterValues: new object[]{ try { (string) object c.get_Item(1) } catch (Exception) { ... }  }
                )
                , 
                selector: (TransparentIdentifier<ValueBuffer, Employee> t1) => new OrderDto{ 
                    new EmployeeDto{ 
                        (?t1.Inner.FirstName?)FirstName = (?t1.Inner.FirstName?), 
                        (?t1.Inner.LastName?)LastName = (?t1.Inner.LastName?) 
                    }
                    Employee = new EmployeeDto() {FirstName = (?t1.Inner.FirstName?), LastName = (?t1.Inner.LastName?)}, 
                    (Nullable<DateTime>) object t1.Outer.get_Item(3)OrderDate = Convert(t1.Outer.get_Item(3)), 
                    try { (int) object t1.Outer.get_Item(4) } catch (Exception) { ... } OrderId = try { ... } 
                }
            )
        )
        Orders = _Select(_InjectParameters(queryContext, _ShapedQuery(queryContext, value(Internal.ShaperCommandContext), value(ExpressionVisitors.Internal.QueryFlattener+CompositeShaper`3[Storage.ValueBuffer,Repro6824.Employee,EntityQueryModelVisitor+TransparentIdentifier`2[Storage.ValueBuffer,Repro6824.Employee]])), new [] {"_outer_CustomerId"}, new [] {try { ... }}), t1 => new OrderDto() {Employee = new EmployeeDto() {FirstName = (?t1.Inner.FirstName?), LastName = (?t1.Inner.LastName?)}, OrderDate = Convert(t1.Outer.get_Item(3)), OrderId = try { ... }}).ToList() 
    }
)

@maumar maumar closed this as completed Nov 16, 2016
@maumar maumar added closed-fixed The issue has been fixed and is/will be included in the release indicated by the issue milestone. and removed type-investigation labels Nov 16, 2016
@FransBouma
Copy link
Author

'Current bits' is v1.2/2.0 ? As it still fails in 1.1.1

@maumar
Copy link
Contributor

maumar commented Mar 8, 2017

I mean our current dev branch (2.0)

@ajcvickers ajcvickers changed the title Projection with nested query fails with crashing SQL query Query: Projection with nested query fails with crashing SQL query May 9, 2017
@divega divega added closed-fixed The issue has been fixed and is/will be included in the release indicated by the issue milestone. and removed closed-fixed The issue has been fixed and is/will be included in the release indicated by the issue milestone. labels May 10, 2017
@ajcvickers ajcvickers modified the milestones: 2.0.0-preview1, 2.0.0 Oct 15, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
closed-fixed The issue has been fixed and is/will be included in the release indicated by the issue milestone. type-bug
Projects
None yet
Development

No branches or pull requests

6 participants