Skip to content

Instantly share code, notes, and snippets.

@FransBouma
Last active October 19, 2016 13:31
Show Gist options
  • Save FransBouma/5d92ddcaa185a9f613b1f50081b28862 to your computer and use it in GitHub Desktop.
Save FransBouma/5d92ddcaa185a9f613b1f50081b28862 to your computer and use it in GitHub Desktop.
Entity Framework Core isn't ready for prime time. (v1.0.1, running on .NET full). It performs left joins in memory and fetches sets in full. Because of that, the full entity select materialization happens in memory, which fails. Why? No idea! See issue: https://github.com/aspnet/EntityFramework/issues/6818

DB: AdventureWorks 2008, SQL Server. Query: (is generated)

/// <summary>Gets the query to fetch the typed list Soh2</summary>
public IQueryable<Soh2TypedListRow> GetSoh2TypedList()
{
	var current0 = this.SalesOrderHeaders;
	var current1 = from salesOrderHeader in current0
					join salesPerson in this.SalesPeople on salesOrderHeader.SalesPerson.SalesPersonId equals salesPerson.SalesPersonId
					join customer in this.Customers on salesOrderHeader.Customer.CustomerId equals customer.CustomerId
					join salesOrderDetail in this.SalesOrderDetails on salesOrderHeader.SalesOrderId equals salesOrderDetail.SalesOrderHeader.SalesOrderId
					join customerAddress in this.CustomerAddresses on customer.CustomerId equals customerAddress.Customer.CustomerId into joinresult_1
					from customerAddress in joinresult_1.DefaultIfEmpty()
					join individual in this.Individuals on customer.CustomerId equals individual.Customer.CustomerId into joinresult_2
					from individual in joinresult_2.DefaultIfEmpty()
					join address in this.Addresses on customerAddress.Address.AddressId equals address.AddressId
					select new {salesPerson, salesOrderHeader, customer, salesOrderDetail, customerAddress, individual, address };
	return current1.Select(v=>new Soh2TypedListRow() { CustomerId = v.customer.CustomerId, CustomerType = v.customer.CustomerType, Demographics = v.individual.Demographics, OrderQty = v.salesOrderDetail.OrderQty, ProductId = v.salesOrderDetail.ProductId, OrderDate = v.salesOrderHeader.OrderDate, SalesOrderId = v.salesOrderHeader.SalesOrderId, City = v.address.City } );
}

Soh2TypedListRow:

/// <summary>Class which represents a row in the typed list 'Soh2'.</summary>
/// <remarks>Contains the following entity definition(s):
/// Entity: Address. <br/>
/// Entity: Customer. <br/>
/// Entity: CustomerAddress. <br/>
/// Entity: Individual. <br/>
/// Entity: SalesOrderDetail. <br/>
/// Entity: SalesOrderHeader. <br/>
/// Entity: SalesPerson. <br/>
/// </remarks>
public partial class Soh2TypedListRow 
{
	#region Extensibility Method Definitions
	partial void OnCreated();
	#endregion
				
	/// <summary>Initializes a new instance of the <see cref="Soh2TypedListRow"/> class.</summary>
	public Soh2TypedListRow()
	{
		OnCreated();
	}

	#region Class Property Declarations
	/// <summary>Gets the CustomerId field. Mapped onto 'Customer.CustomerId'</summary>
	public System.Int32 CustomerId { get; set; }
		
	/// <summary>Gets the CustomerType field. Mapped onto 'Customer.CustomerType'</summary>
	public System.String CustomerType { get; set; }
		
	/// <summary>Gets the Demographics field. Mapped onto 'Individual.Demographics'</summary>
	public System.String Demographics { get; set; }
		
	/// <summary>Gets the OrderQty field. Mapped onto 'SalesOrderDetail.OrderQty'</summary>
	public System.Int16 OrderQty { get; set; }
		
	/// <summary>Gets the ProductId field. Mapped onto 'SalesOrderDetail.ProductId'</summary>
	public System.Int32 ProductId { get; set; }
		
	/// <summary>Gets the OrderDate field. Mapped onto 'SalesOrderHeader.OrderDate'</summary>
	public System.DateTime OrderDate { get; set; }
		
	/// <summary>Gets the SalesOrderId field. Mapped onto 'SalesOrderHeader.SalesOrderId'</summary>
	public System.Int32 SalesOrderId { get; set; }
		
	/// <summary>Gets the City field. Mapped onto 'Address.City'</summary>
	public System.String City { get; set; }
		
	#endregion
}

simple test:

[Test]
public void FetchTypedList()
{
	using(var ctx = new AdventureWorksDataContext())
	{
		var allRows = ctx.GetSoh2TypedList().ToList();
		Assert.IsTrue(allRows.Count > 0);
	}
}

gives log: (default logger)

System.NullReferenceException : Object reference not set to an instance of an object.
   at lambda_method(Closure , TransparentIdentifier`2 )
   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 AWTests.ReadTests.FetchTypedList() in C:\Temp\generatortest\Test1\AWTests\ReadTests.cs:line 46

Compiling query model: 'from SalesOrderHeader salesOrderHeader in value(Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable`1[AW.EntityClasses.SalesOrderHeader]) join SalesPerson salesPerson in value(Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable`1[AW.EntityClasses.SalesPerson]) on [salesOrderHeader].SalesPerson.SalesPersonId equals [salesPerson].SalesPersonId join Customer customer in value(Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable`1[AW.EntityClasses.Customer]) on [salesOrderHeader].Customer.CustomerId equals [customer].CustomerId join SalesOrderDetail salesOrderDetail in value(Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable`1[AW.EntityClasses.SalesOrderDetail]) on [salesOrderHeader].SalesOrderId equals [salesOrderDetail].SalesOrderHeader.SalesOrderId join CustomerAddress customerAddress in value(Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable`1[AW.EntityClasses.CustomerAddress]) on [customer].CustomerId equals [customerAddress].Customer.CustomerId into IEnumerable`1 joinresult_1 from CustomerAddress customerAddress in {[joinresult_1] => DefaultIfEmpty()} join Individual individual in value(Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable`1[AW.EntityClasses.Individual]) on [customer].CustomerId equals [individual].Customer.CustomerId into IEnumerable`1 joinresult_2 from Individual individual in {[joinresult_2] => DefaultIfEmpty()} join Address address in value(Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable`1[AW.EntityClasses.Address]) on [customerAddress].Address.AddressId equals [address].AddressId select new Soh2TypedListRow() {CustomerId = [customer].CustomerId, CustomerType = [customer].CustomerType, Demographics = [individual].Demographics, OrderQty = [salesOrderDetail].OrderQty, ProductId = [salesOrderDetail].ProductId, OrderDate = [salesOrderHeader].OrderDate, SalesOrderId = [salesOrderHeader].SalesOrderId, City = [address].City}'
Optimized query model: 'from SalesOrderHeader salesOrderHeader in value(Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable`1[AW.EntityClasses.SalesOrderHeader]) join SalesPerson salesPerson in value(Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable`1[AW.EntityClasses.SalesPerson]) on Property([salesOrderHeader], "SalesPersonId") equals [salesPerson].SalesPersonId join Customer customer in value(Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable`1[AW.EntityClasses.Customer]) on Property([salesOrderHeader], "CustomerId") equals [customer].CustomerId join SalesOrderDetail salesOrderDetail in value(Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable`1[AW.EntityClasses.SalesOrderDetail]) on [salesOrderHeader].SalesOrderId equals Property([salesOrderDetail], "SalesOrderId") join CustomerAddress customerAddress in value(Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable`1[AW.EntityClasses.CustomerAddress]) on [customer].CustomerId equals Property([customerAddress], "CustomerId") into IEnumerable`1 joinresult_1 from CustomerAddress customerAddress in {[joinresult_1] => DefaultIfEmpty()} join Individual individual in value(Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable`1[AW.EntityClasses.Individual]) on [customer].CustomerId equals Property([individual], "CustomerId") into IEnumerable`1 joinresult_2 from Individual individual in {[joinresult_2] => DefaultIfEmpty()} join Address address in value(Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable`1[AW.EntityClasses.Address]) on Property([customerAddress], "AddressId") equals [address].AddressId select new Soh2TypedListRow() {CustomerId = [customer].CustomerId, CustomerType = [customer].CustomerType, Demographics = [individual].Demographics, OrderQty = [salesOrderDetail].OrderQty, ProductId = [salesOrderDetail].ProductId, OrderDate = [salesOrderHeader].OrderDate, SalesOrderId = [salesOrderHeader].SalesOrderId, City = [address].City}'
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 CustomerAddress customerAddress in {[joinresult_1] => 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 'join Individual individual in value(Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable`1[AW.EntityClasses.Individual]) on [customer].CustomerId equals Property([individual], "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.
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 Individual individual in {[joinresult_2] => 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 'join Address address in value(Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable`1[AW.EntityClasses.Address]) on Property([customerAddress], "AddressId") equals [address].AddressId' 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<Soh2TypedListRow> _Select(
    source: IEnumerable<TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<SalesOrderHeader, ValueBuffer>, ValueBuffer>, ValueBuffer>, IEnumerable<CustomerAddress>>, CustomerAddress>, IEnumerable<Individual>>, Individual>, ValueBuffer>> _Join(
        outer: IEnumerable<TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<SalesOrderHeader, ValueBuffer>, ValueBuffer>, ValueBuffer>, IEnumerable<CustomerAddress>>, CustomerAddress>, IEnumerable<Individual>>, Individual>> _SelectMany(
            source: IEnumerable<TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<SalesOrderHeader, ValueBuffer>, ValueBuffer>, ValueBuffer>, IEnumerable<CustomerAddress>>, CustomerAddress>, IEnumerable<Individual>>> _GroupJoin(
                outer: IEnumerable<TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<SalesOrderHeader, ValueBuffer>, ValueBuffer>, ValueBuffer>, IEnumerable<CustomerAddress>>, CustomerAddress>> _SelectMany(
                    source: IEnumerable<TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<SalesOrderHeader, ValueBuffer>, ValueBuffer>, ValueBuffer>, IEnumerable<CustomerAddress>>> _GroupJoin(
                        queryContext: (RelationalQueryContext) queryContext, 
                        source: IEnumerable<ValueBuffer> _Query(
                            queryContext: queryContext, 
                            shaperCommandContext: SelectExpression: 
                                SELECT [salesOrderHeader].[SalesOrderID], [salesOrderHeader].[AccountNumber], [salesOrderHeader].[BillToAddressID], [salesOrderHeader].[Comment], [salesOrderHeader].[ContactID], [salesOrderHeader].[CreditCardApprovalCode], [salesOrderHeader].[CreditCardID], [salesOrderHeader].[CurrencyRateID], [salesOrderHeader].[CustomerID], [salesOrderHeader].[DueDate], [salesOrderHeader].[Freight], [salesOrderHeader].[ModifiedDate], [salesOrderHeader].[OnlineOrderFlag], [salesOrderHeader].[OrderDate], [salesOrderHeader].[PurchaseOrderNumber], [salesOrderHeader].[RevisionNumber], [salesOrderHeader].[rowguid], [salesOrderHeader].[SalesOrderNumber], [salesOrderHeader].[SalesPersonID], [salesOrderHeader].[ShipDate], [salesOrderHeader].[ShipMethodID], [salesOrderHeader].[ShipToAddressID], [salesOrderHeader].[Status], [salesOrderHeader].[SubTotal], [salesOrderHeader].[TaxAmt], [salesOrderHeader].[TerritoryID], [salesOrderHeader].[TotalDue], [customerAddress].[AddressID], [customerAddress].[CustomerID], [customerAddress].[AddressTypeID], [customerAddress].[ModifiedDate], [customerAddress].[rowguid], [customer].[CustomerID], [customer].[CustomerType], [salesOrderDetail].[OrderQty], [salesOrderDetail].[ProductID]
                                FROM [Sales].[SalesOrderHeader] AS [salesOrderHeader]
                                INNER JOIN [Sales].[SalesPerson] AS [salesPerson] ON [salesOrderHeader].[SalesPersonID] = [salesPerson].[SalesPersonID]
                                INNER JOIN [Sales].[Customer] AS [customer] ON [salesOrderHeader].[CustomerID] = [customer].[CustomerID]
                                INNER JOIN [Sales].[SalesOrderDetail] AS [salesOrderDetail] ON [salesOrderHeader].[SalesOrderID] = [salesOrderDetail].[SalesOrderID]
                                LEFT JOIN [Sales].[CustomerAddress] AS [customerAddress] ON [customer].[CustomerID] = [customerAddress].[CustomerID]
                                ORDER BY [customer].[CustomerID]
                            , 
                            queryIndex: default(System.Nullable`1[System.Int32])
                        )
                        , 
                        outerShaper: CompositeShaper`3, 
                        innerShaper: BufferedOffsetEntityShaper<CustomerAddress>, 
                        innerKeySelector: (CustomerAddress customerAddress) => int GetValue(
                            queryContext: queryContext, 
                            entity: customerAddress, 
                            property: CustomerId
                        )
                        , 
                        resultSelector: (TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<SalesOrderHeader, ValueBuffer>, ValueBuffer>, ValueBuffer> t2 | IEnumerable<CustomerAddress> joinresult_1) => TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<SalesOrderHeader, ValueBuffer>, ValueBuffer>, ValueBuffer>, IEnumerable<CustomerAddress>> CreateTransparentIdentifier(
                            outer: t2, 
                            inner: joinresult_1
                        )
                        , 
                        outerGroupJoinInclude: default(Internal.GroupJoinInclude), 
                        innerGroupJoinInclude: default(Internal.GroupJoinInclude)
                    )
                    , 
                    collectionSelector: (TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<SalesOrderHeader, ValueBuffer>, ValueBuffer>, ValueBuffer>, IEnumerable<CustomerAddress>> t3) => IEnumerable<CustomerAddress> DefaultIfEmpty(
                        source: t3.Inner
                    )
                    , 
                    resultSelector: (TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<SalesOrderHeader, ValueBuffer>, ValueBuffer>, ValueBuffer>, IEnumerable<CustomerAddress>> t3 | CustomerAddress customerAddress) => TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<SalesOrderHeader, ValueBuffer>, ValueBuffer>, ValueBuffer>, IEnumerable<CustomerAddress>>, CustomerAddress> CreateTransparentIdentifier(
                        outer: t3, 
                        inner: customerAddress
                    )
                )
                , 
                inner: IEnumerable<Individual> _ShapedQuery(
                    queryContext: queryContext, 
                    shaperCommandContext: SelectExpression: 
                        SELECT [individual].[CustomerID], [individual].[ContactID], [individual].[Demographics], [individual].[ModifiedDate]
                        FROM [Sales].[Individual] AS [individual]
                    , 
                    shaper: BufferedEntityShaper<Individual>
                )
                , 
                outerKeySelector: (TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<SalesOrderHeader, ValueBuffer>, ValueBuffer>, ValueBuffer>, IEnumerable<CustomerAddress>>, CustomerAddress> t4) => (int) object t4.Outer.Outer.Outer.Inner.get_Item(32), 
                innerKeySelector: (Individual individual) => int GetValue(
                    queryContext: queryContext, 
                    entity: individual, 
                    property: CustomerId
                )
                , 
                resultSelector: (TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<SalesOrderHeader, ValueBuffer>, ValueBuffer>, ValueBuffer>, IEnumerable<CustomerAddress>>, CustomerAddress> t4 | IEnumerable<Individual> joinresult_2) => TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<SalesOrderHeader, ValueBuffer>, ValueBuffer>, ValueBuffer>, IEnumerable<CustomerAddress>>, CustomerAddress>, IEnumerable<Individual>> CreateTransparentIdentifier(
                    outer: t4, 
                    inner: joinresult_2
                )
            )
            , 
            collectionSelector: (TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<SalesOrderHeader, ValueBuffer>, ValueBuffer>, ValueBuffer>, IEnumerable<CustomerAddress>>, CustomerAddress>, IEnumerable<Individual>> t5) => IEnumerable<Individual> DefaultIfEmpty(
                source: t5.Inner
            )
            , 
            resultSelector: (TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<SalesOrderHeader, ValueBuffer>, ValueBuffer>, ValueBuffer>, IEnumerable<CustomerAddress>>, CustomerAddress>, IEnumerable<Individual>> t5 | Individual individual) => TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<SalesOrderHeader, ValueBuffer>, ValueBuffer>, ValueBuffer>, IEnumerable<CustomerAddress>>, CustomerAddress>, IEnumerable<Individual>>, Individual> CreateTransparentIdentifier(
                outer: t5, 
                inner: individual
            )
        )
        , 
        inner: IEnumerable<ValueBuffer> _ShapedQuery(
            queryContext: queryContext, 
            shaperCommandContext: SelectExpression: 
                SELECT [address].[AddressID], [address].[City]
                FROM [Person].[Address] AS [address]
            , 
            shaper: ValueBufferShaper
        )
        , 
        outerKeySelector: (TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<SalesOrderHeader, ValueBuffer>, ValueBuffer>, ValueBuffer>, IEnumerable<CustomerAddress>>, CustomerAddress>, IEnumerable<Individual>>, Individual> t6) => int GetValue(
            queryContext: queryContext, 
            entity: t6.Outer.Outer.Inner, 
            property: AddressId
        )
        , 

System.NullReferenceException : Object reference not set to an instance of an object.
   at lambda_method(Closure , TransparentIdentifier`2 )
   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 AWTests.ReadTests.FetchTypedList() in C:\Temp\generatortest\Test1\AWTests\ReadTests.cs:line 46

Compiling query model: 'from SalesOrderHeader salesOrderHeader in value(Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable`1[AW.EntityClasses.SalesOrderHeader]) join SalesPerson salesPerson in value(Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable`1[AW.EntityClasses.SalesPerson]) on [salesOrderHeader].SalesPerson.SalesPersonId equals [salesPerson].SalesPersonId join Customer customer in value(Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable`1[AW.EntityClasses.Customer]) on [salesOrderHeader].Customer.CustomerId equals [customer].CustomerId join SalesOrderDetail salesOrderDetail in value(Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable`1[AW.EntityClasses.SalesOrderDetail]) on [salesOrderHeader].SalesOrderId equals [salesOrderDetail].SalesOrderHeader.SalesOrderId join CustomerAddress customerAddress in value(Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable`1[AW.EntityClasses.CustomerAddress]) on [customer].CustomerId equals [customerAddress].Customer.CustomerId into IEnumerable`1 joinresult_1 from CustomerAddress customerAddress in {[joinresult_1] => DefaultIfEmpty()} join Individual individual in value(Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable`1[AW.EntityClasses.Individual]) on [customer].CustomerId equals [individual].Customer.CustomerId into IEnumerable`1 joinresult_2 from Individual individual in {[joinresult_2] => DefaultIfEmpty()} join Address address in value(Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable`1[AW.EntityClasses.Address]) on [customerAddress].Address.AddressId equals [address].AddressId select new Soh2TypedListRow() {CustomerId = [customer].CustomerId, CustomerType = [customer].CustomerType, Demographics = [individual].Demographics, OrderQty = [salesOrderDetail].OrderQty, ProductId = [salesOrderDetail].ProductId, OrderDate = [salesOrderHeader].OrderDate, SalesOrderId = [salesOrderHeader].SalesOrderId, City = [address].City}'
Optimized query model: 'from SalesOrderHeader salesOrderHeader in value(Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable`1[AW.EntityClasses.SalesOrderHeader]) join SalesPerson salesPerson in value(Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable`1[AW.EntityClasses.SalesPerson]) on Property([salesOrderHeader], "SalesPersonId") equals [salesPerson].SalesPersonId join Customer customer in value(Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable`1[AW.EntityClasses.Customer]) on Property([salesOrderHeader], "CustomerId") equals [customer].CustomerId join SalesOrderDetail salesOrderDetail in value(Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable`1[AW.EntityClasses.SalesOrderDetail]) on [salesOrderHeader].SalesOrderId equals Property([salesOrderDetail], "SalesOrderId") join CustomerAddress customerAddress in value(Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable`1[AW.EntityClasses.CustomerAddress]) on [customer].CustomerId equals Property([customerAddress], "CustomerId") into IEnumerable`1 joinresult_1 from CustomerAddress customerAddress in {[joinresult_1] => DefaultIfEmpty()} join Individual individual in value(Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable`1[AW.EntityClasses.Individual]) on [customer].CustomerId equals Property([individual], "CustomerId") into IEnumerable`1 joinresult_2 from Individual individual in {[joinresult_2] => DefaultIfEmpty()} join Address address in value(Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable`1[AW.EntityClasses.Address]) on Property([customerAddress], "AddressId") equals [address].AddressId select new Soh2TypedListRow() {CustomerId = [customer].CustomerId, CustomerType = [customer].CustomerType, Demographics = [individual].Demographics, OrderQty = [salesOrderDetail].OrderQty, ProductId = [salesOrderDetail].ProductId, OrderDate = [salesOrderHeader].OrderDate, SalesOrderId = [salesOrderHeader].SalesOrderId, City = [address].City}'
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 CustomerAddress customerAddress in {[joinresult_1] => 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 'join Individual individual in value(Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable`1[AW.EntityClasses.Individual]) on [customer].CustomerId equals Property([individual], "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.
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 Individual individual in {[joinresult_2] => 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 'join Address address in value(Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable`1[AW.EntityClasses.Address]) on Property([customerAddress], "AddressId") equals [address].AddressId' 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<Soh2TypedListRow> _Select(
    source: IEnumerable<TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<SalesOrderHeader, ValueBuffer>, ValueBuffer>, ValueBuffer>, IEnumerable<CustomerAddress>>, CustomerAddress>, IEnumerable<Individual>>, Individual>, ValueBuffer>> _Join(
        outer: IEnumerable<TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<SalesOrderHeader, ValueBuffer>, ValueBuffer>, ValueBuffer>, IEnumerable<CustomerAddress>>, CustomerAddress>, IEnumerable<Individual>>, Individual>> _SelectMany(
            source: IEnumerable<TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<SalesOrderHeader, ValueBuffer>, ValueBuffer>, ValueBuffer>, IEnumerable<CustomerAddress>>, CustomerAddress>, IEnumerable<Individual>>> _GroupJoin(
                outer: IEnumerable<TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<SalesOrderHeader, ValueBuffer>, ValueBuffer>, ValueBuffer>, IEnumerable<CustomerAddress>>, CustomerAddress>> _SelectMany(
                    source: IEnumerable<TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<SalesOrderHeader, ValueBuffer>, ValueBuffer>, ValueBuffer>, IEnumerable<CustomerAddress>>> _GroupJoin(
                        queryContext: (RelationalQueryContext) queryContext, 
                        source: IEnumerable<ValueBuffer> _Query(
                            queryContext: queryContext, 
                            shaperCommandContext: SelectExpression: 
                                SELECT [salesOrderHeader].[SalesOrderID], [salesOrderHeader].[AccountNumber], [salesOrderHeader].[BillToAddressID], [salesOrderHeader].[Comment], [salesOrderHeader].[ContactID], [salesOrderHeader].[CreditCardApprovalCode], [salesOrderHeader].[CreditCardID], [salesOrderHeader].[CurrencyRateID], [salesOrderHeader].[CustomerID], [salesOrderHeader].[DueDate], [salesOrderHeader].[Freight], [salesOrderHeader].[ModifiedDate], [salesOrderHeader].[OnlineOrderFlag], [salesOrderHeader].[OrderDate], [salesOrderHeader].[PurchaseOrderNumber], [salesOrderHeader].[RevisionNumber], [salesOrderHeader].[rowguid], [salesOrderHeader].[SalesOrderNumber], [salesOrderHeader].[SalesPersonID], [salesOrderHeader].[ShipDate], [salesOrderHeader].[ShipMethodID], [salesOrderHeader].[ShipToAddressID], [salesOrderHeader].[Status], [salesOrderHeader].[SubTotal], [salesOrderHeader].[TaxAmt], [salesOrderHeader].[TerritoryID], [salesOrderHeader].[TotalDue], [customerAddress].[AddressID], [customerAddress].[CustomerID], [customerAddress].[AddressTypeID], [customerAddress].[ModifiedDate], [customerAddress].[rowguid], [customer].[CustomerID], [customer].[CustomerType], [salesOrderDetail].[OrderQty], [salesOrderDetail].[ProductID]
                                FROM [Sales].[SalesOrderHeader] AS [salesOrderHeader]
                                INNER JOIN [Sales].[SalesPerson] AS [salesPerson] ON [salesOrderHeader].[SalesPersonID] = [salesPerson].[SalesPersonID]
                                INNER JOIN [Sales].[Customer] AS [customer] ON [salesOrderHeader].[CustomerID] = [customer].[CustomerID]
                                INNER JOIN [Sales].[SalesOrderDetail] AS [salesOrderDetail] ON [salesOrderHeader].[SalesOrderID] = [salesOrderDetail].[SalesOrderID]
                                LEFT JOIN [Sales].[CustomerAddress] AS [customerAddress] ON [customer].[CustomerID] = [customerAddress].[CustomerID]
                                ORDER BY [customer].[CustomerID]
                            , 
                            queryIndex: default(System.Nullable`1[System.Int32])
                        )
                        , 
                        outerShaper: CompositeShaper`3, 
                        innerShaper: BufferedOffsetEntityShaper<CustomerAddress>, 
                        innerKeySelector: (CustomerAddress customerAddress) => int GetValue(
                            queryContext: queryContext, 
                            entity: customerAddress, 
                            property: CustomerId
                        )
                        , 
                        resultSelector: (TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<SalesOrderHeader, ValueBuffer>, ValueBuffer>, ValueBuffer> t2 | IEnumerable<CustomerAddress> joinresult_1) => TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<SalesOrderHeader, ValueBuffer>, ValueBuffer>, ValueBuffer>, IEnumerable<CustomerAddress>> CreateTransparentIdentifier(
                            outer: t2, 
                            inner: joinresult_1
                        )
                        , 
                        outerGroupJoinInclude: default(Internal.GroupJoinInclude), 
                        innerGroupJoinInclude: default(Internal.GroupJoinInclude)
                    )
                    , 
                    collectionSelector: (TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<SalesOrderHeader, ValueBuffer>, ValueBuffer>, ValueBuffer>, IEnumerable<CustomerAddress>> t3) => IEnumerable<CustomerAddress> DefaultIfEmpty(
                        source: t3.Inner
                    )
                    , 
                    resultSelector: (TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<SalesOrderHeader, ValueBuffer>, ValueBuffer>, ValueBuffer>, IEnumerable<CustomerAddress>> t3 | CustomerAddress customerAddress) => TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<SalesOrderHeader, ValueBuffer>, ValueBuffer>, ValueBuffer>, IEnumerable<CustomerAddress>>, CustomerAddress> CreateTransparentIdentifier(
                        outer: t3, 
                        inner: customerAddress
                    )
                )
                , 
                inner: IEnumerable<Individual> _ShapedQuery(
                    queryContext: queryContext, 
                    shaperCommandContext: SelectExpression: 
                        SELECT [individual].[CustomerID], [individual].[ContactID], [individual].[Demographics], [individual].[ModifiedDate]
                        FROM [Sales].[Individual] AS [individual]
                    , 
                    shaper: BufferedEntityShaper<Individual>
                )
                , 
                outerKeySelector: (TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<SalesOrderHeader, ValueBuffer>, ValueBuffer>, ValueBuffer>, IEnumerable<CustomerAddress>>, CustomerAddress> t4) => (int) object t4.Outer.Outer.Outer.Inner.get_Item(32), 
                innerKeySelector: (Individual individual) => int GetValue(
                    queryContext: queryContext, 
                    entity: individual, 
                    property: CustomerId
                )
                , 
                resultSelector: (TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<SalesOrderHeader, ValueBuffer>, ValueBuffer>, ValueBuffer>, IEnumerable<CustomerAddress>>, CustomerAddress> t4 | IEnumerable<Individual> joinresult_2) => TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<SalesOrderHeader, ValueBuffer>, ValueBuffer>, ValueBuffer>, IEnumerable<CustomerAddress>>, CustomerAddress>, IEnumerable<Individual>> CreateTransparentIdentifier(
                    outer: t4, 
                    inner: joinresult_2
                )
            )
            , 
            collectionSelector: (TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<SalesOrderHeader, ValueBuffer>, ValueBuffer>, ValueBuffer>, IEnumerable<CustomerAddress>>, CustomerAddress>, IEnumerable<Individual>> t5) => IEnumerable<Individual> DefaultIfEmpty(
                source: t5.Inner
            )
            , 
            resultSelector: (TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<SalesOrderHeader, ValueBuffer>, ValueBuffer>, ValueBuffer>, IEnumerable<CustomerAddress>>, CustomerAddress>, IEnumerable<Individual>> t5 | Individual individual) => TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<SalesOrderHeader, ValueBuffer>, ValueBuffer>, ValueBuffer>, IEnumerable<CustomerAddress>>, CustomerAddress>, IEnumerable<Individual>>, Individual> CreateTransparentIdentifier(
                outer: t5, 
                inner: individual
            )
        )
        , 
        inner: IEnumerable<ValueBuffer> _ShapedQuery(
            queryContext: queryContext, 
            shaperCommandContext: SelectExpression: 
                SELECT [address].[AddressID], [address].[City]
                FROM [Person].[Address] AS [address]
            , 
            shaper: ValueBufferShaper
        )
        , 
        outerKeySelector: (TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<SalesOrderHeader, ValueBuffer>, ValueBuffer>, ValueBuffer>, IEnumerable<CustomerAddress>>, CustomerAddress>, IEnumerable<Individual>>, Individual> t6) => int GetValue(
            queryContext: queryContext, 
            entity: t6.Outer.Outer.Inner, 
            property: AddressId
        )
        , 
        innerKeySelector: (ValueBuffer address) => (int) object address.get_Item(0), 
        resultSelector: (TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<SalesOrderHeader, ValueBuffer>, ValueBuffer>, ValueBuffer>, IEnumerable<CustomerAddress>>, CustomerAddress>, IEnumerable<Individual>>, Individual> t6 | ValueBuffer address) => TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<SalesOrderHeader, ValueBuffer>, ValueBuffer>, ValueBuffer>, IEnumerable<CustomerAddress>>, CustomerAddress>, IEnumerable<Individual>>, Individual>, ValueBuffer> CreateTransparentIdentifier(
            outer: t6, 
            inner: address
        )
    )
    , 
    selector: (TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<TransparentIdentifier<SalesOrderHeader, ValueBuffer>, ValueBuffer>, ValueBuffer>, IEnumerable<CustomerAddress>>, CustomerAddress>, IEnumerable<Individual>>, Individual>, ValueBuffer> t7) => new Soh2TypedListRow{ 
        (int) object t7.Outer.Outer.Outer.Outer.Outer.Outer.Inner.get_Item(32)CustomerId = Convert(t7.Outer.Outer.Outer.Outer.Outer.Outer.Inner.get_Item(32)), 
        (string) object t7.Outer.Outer.Outer.Outer.Outer.Outer.Inner.get_Item(33)CustomerType = Convert(t7.Outer.Outer.Outer.Outer.Outer.Outer.Inner.get_Item(33)), 
        t7.Outer.Inner.DemographicsDemographics = t7.Outer.Inner.Demographics, 
        (short) object t7.Outer.Outer.Outer.Outer.Outer.Inner.get_Item(34)OrderQty = Convert(t7.Outer.Outer.Outer.Outer.Outer.Inner.get_Item(34)), 
        (int) object t7.Outer.Outer.Outer.Outer.Outer.Inner.get_Item(35)ProductId = Convert(t7.Outer.Outer.Outer.Outer.Outer.Inner.get_Item(35)), 
        t7.Outer.Outer.Outer.Outer.Outer.Outer.Outer.Outer.OrderDateOrderDate = t7.Outer.Outer.Outer.Outer.Outer.Outer.Outer.Outer.OrderDate, 
        t7.Outer.Outer.Outer.Outer.Outer.Outer.Outer.Outer.SalesOrderIdSalesOrderId = t7.Outer.Outer.Outer.Outer.Outer.Outer.Outer.Outer.SalesOrderId, 
        (string) object t7.Inner.get_Item(1)City = Convert(t7.Inner.get_Item(1)) 
    }
)

Opening connection to database 'AdventureWorksUnitTests' on server '<server id>'.
Executed DbCommand (32ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
SELECT [address].[AddressID], [address].[City]
FROM [Person].[Address] AS [address]
Closing connection to database 'AdventureWorksUnitTests' on server '<server id>'.
Opening connection to database 'AdventureWorksUnitTests' on server '<server id>'.
Executed DbCommand (33ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
SELECT [individual].[CustomerID], [individual].[ContactID], [individual].[Demographics], [individual].[ModifiedDate]
FROM [Sales].[Individual] AS [individual]
Closing connection to database 'AdventureWorksUnitTests' on server '<server id>'.
Opening connection to database 'AdventureWorksUnitTests' on server '<server id>'.
Executed DbCommand (629ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
SELECT [salesOrderHeader].[SalesOrderID], [salesOrderHeader].[AccountNumber], [salesOrderHeader].[BillToAddressID], [salesOrderHeader].[Comment], [salesOrderHeader].[ContactID], [salesOrderHeader].[CreditCardApprovalCode], [salesOrderHeader].[CreditCardID], [salesOrderHeader].[CurrencyRateID], [salesOrderHeader].[CustomerID], [salesOrderHeader].[DueDate], [salesOrderHeader].[Freight], [salesOrderHeader].[ModifiedDate], [salesOrderHeader].[OnlineOrderFlag], [salesOrderHeader].[OrderDate], [salesOrderHeader].[PurchaseOrderNumber], [salesOrderHeader].[RevisionNumber], [salesOrderHeader].[rowguid], [salesOrderHeader].[SalesOrderNumber], [salesOrderHeader].[SalesPersonID], [salesOrderHeader].[ShipDate], [salesOrderHeader].[ShipMethodID], [salesOrderHeader].[ShipToAddressID], [salesOrderHeader].[Status], [salesOrderHeader].[SubTotal], [salesOrderHeader].[TaxAmt], [salesOrderHeader].[TerritoryID], [salesOrderHeader].[TotalDue], [customerAddress].[AddressID], [customerAddress].[CustomerID], [customerAddress].[AddressTypeID], [customerAddress].[ModifiedDate], [customerAddress].[rowguid], [customer].[CustomerID], [customer].[CustomerType], [salesOrderDetail].[OrderQty], [salesOrderDetail].[ProductID]
FROM [Sales].[SalesOrderHeader] AS [salesOrderHeader]
INNER JOIN [Sales].[SalesPerson] AS [salesPerson] ON [salesOrderHeader].[SalesPersonID] = [salesPerson].[SalesPersonID]
INNER JOIN [Sales].[Customer] AS [customer] ON [salesOrderHeader].[CustomerID] = [customer].[CustomerID]
INNER JOIN [Sales].[SalesOrderDetail] AS [salesOrderDetail] ON [salesOrderHeader].[SalesOrderID] = [salesOrderDetail].[SalesOrderID]
LEFT JOIN [Sales].[CustomerAddress] AS [customerAddress] ON [customer].[CustomerID] = [customerAddress].[CustomerID]
ORDER BY [customer].[CustomerID]
An exception occurred in the database while iterating the results of a query.
System.NullReferenceException: Object reference not set to an instance of an object.
   at lambda_method(Closure , TransparentIdentifier`2 )
   at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
   at Microsoft.EntityFrameworkCore.Query.Internal.LinqOperatorProvider.ExceptionInterceptor`1.EnumeratorExceptionInterceptor.MoveNext()
Closing connection to database 'AdventureWorksUnitTests' on server '<server id>'.
@FransBouma
Copy link
Author

No, I pulled the 1.0.1 from Nuget. I actually have to make it work with their latest official releases, as the code you see here is all generated from the entity model in our designer. So the query, the mappings, the context, the entity classes. It has to work with their official code. I don't see why it would fail. The initial error I had (a field which was nullable in the DB wasn't mapped as nullable in the model) caused an NRE in a simple entity query, but after fixing that this one still fails with the same issue.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment