Skip to content

Commit

Permalink
Handle ListInitExpression in entity equality
Browse files Browse the repository at this point in the history
Closes #18379
  • Loading branch information
roji committed Oct 16, 2019
1 parent 59fbd88 commit 7e07b2b
Show file tree
Hide file tree
Showing 4 changed files with 40 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -132,6 +132,16 @@ protected override Expression VisitMemberInit(MemberInitExpression memberInitExp
protected override Expression VisitNewArray(NewArrayExpression newArrayExpression)
=> newArrayExpression.Update(Visit(newArrayExpression.Expressions).Select(Unwrap));

// Note that we could bubble up entity type information from the expressions initializing the list. However, EF Core doesn't
// actually support doing much further with this list, so it's not worth the complexity (right now). So we simply unwrap.
protected override Expression VisitListInit(ListInitExpression listInitExpression)
=> listInitExpression.Update(
(NewExpression)Unwrap(listInitExpression.NewExpression),
listInitExpression.Initializers.Select(VisitElementInit));

protected override ElementInit VisitElementInit(ElementInit elementInit)
=> Expression.ElementInit(elementInit.AddMethod, Visit(elementInit.Arguments).Select(Unwrap));

protected override Expression VisitMember(MemberExpression memberExpression)
{
var visitedExpression = base.Visit(memberExpression.Expression);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,15 @@ FROM root c
WHERE (c[""Discriminator""] = ""Customer"")");
}

public override async Task Projection_of_entity_type_into_object_list(bool isAsync)
{
await base.Projection_of_entity_type_into_object_list(isAsync);

AssertSql(
@"SELECT c[""CustomerID""], c[""Address""], c[""City""], c[""CompanyName""], c[""ContactName""], c[""ContactTitle""], c[""Country""], c[""Fax""], c[""Phone""], c[""PostalCode""], c[""Region""]
FROM root c");
}

public override async Task Project_to_int_array(bool isAsync)
{
await base.Project_to_int_array(isAsync);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore.Diagnostics;
Expand Down Expand Up @@ -90,6 +91,17 @@ public virtual Task Projection_of_multiple_entity_types_into_object_array(bool i
assertOrder: true);
}

[ConditionalTheory]
[MemberData(nameof(IsAsyncData))]
public virtual Task Projection_of_entity_type_into_object_list(bool isAsync)
{
return AssertQuery(
isAsync,
ss => ss.Set<Customer>().Select(c => new List<object> { c }),
entryCount: 91,
assertOrder: true);
}

[ConditionalTheory]
[MemberData(nameof(IsAsyncData))]
public virtual Task Project_to_int_array(bool isAsync)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,15 @@ WHERE [o].[OrderID] < 10300
ORDER BY [o].[OrderID]");
}

public override async Task Projection_of_entity_type_into_object_list(bool isAsync)
{
await base.Projection_of_entity_type_into_object_list(isAsync);

AssertSql(
@"SELECT [c].[CustomerID], [c].[Address], [c].[City], [c].[CompanyName], [c].[ContactName], [c].[ContactTitle], [c].[Country], [c].[Fax], [c].[Phone], [c].[PostalCode], [c].[Region]
FROM [Customers] AS [c]");
}

public override async Task Project_to_int_array(bool isAsync)
{
await base.Project_to_int_array(isAsync);
Expand Down

0 comments on commit 7e07b2b

Please sign in to comment.