Skip to content

Commit

Permalink
Handle NewArrayExpression in entity equality
Browse files Browse the repository at this point in the history
Fixes #17744
  • Loading branch information
roji committed Oct 14, 2019
1 parent 250c1cb commit 59fbd88
Show file tree
Hide file tree
Showing 4 changed files with 75 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -127,6 +127,11 @@ protected override Expression VisitMemberInit(MemberInitExpression memberInitExp
}
}

// Note that we could bubble up entity type information from the expressions initializing the array. However, EF Core doesn't
// actually support doing much further with this array, so it's not worth the complexity (right now). So we simply unwrap.
protected override Expression VisitNewArray(NewArrayExpression newArrayExpression)
=> newArrayExpression.Update(Visit(newArrayExpression.Expressions).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 @@ -83,6 +83,29 @@ FROM root c
WHERE ((c[""Discriminator""] = ""Employee"") AND (c[""EmployeeID""] = 1))");
}

[ConditionalTheory(Skip = "Issue#17246")]
public override async Task Projection_of_entity_type_into_object_array(bool isAsync)
{
await base.Projection_of_entity_type_into_object_array(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
WHERE ((c[""Discriminator""] = ""Employee"") AND c[""CustomerID""] LIKE N'A%'
ORDER BY c[""CustomerID""]");
}

[ConditionalTheory(Skip = "Issue#17246")]
public override async Task Projection_of_multiple_entity_types_into_object_array(bool isAsync)
{
await base.Projection_of_multiple_entity_types_into_object_array(isAsync);

AssertSql(
@"SELECT c
FROM root c
WHERE (c[""Discriminator""] = ""Customer"")");
}

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 @@ -66,6 +66,30 @@ public virtual Task Project_to_object_array(bool isAsync)
elementAsserter: (e, a) => AssertArrays(e, a, 3));
}

[ConditionalTheory]
[MemberData(nameof(IsAsyncData))]
public virtual Task Projection_of_entity_type_into_object_array(bool isAsync)
{
return AssertQuery(
isAsync,
ss => ss.Set<Customer>().OrderBy(c => c.CustomerID).Where(c => c.CustomerID.StartsWith("A"))
.Select(c => new object[] { c }),
entryCount: 4,
assertOrder: true);
}

[ConditionalTheory]
[MemberData(nameof(IsAsyncData))]
public virtual Task Projection_of_multiple_entity_types_into_object_array(bool isAsync)
{
return AssertQuery(
isAsync,
ss => ss.Set<Order>().OrderBy(o => o.OrderID).Where(o => o.OrderID < 10300)
.Select(o => new object[] { o, o.Customer }),
entryCount: 87,
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 @@ -79,6 +79,29 @@ FROM [Employees] AS [e]
WHERE [e].[EmployeeID] = 1");
}

public override async Task Projection_of_entity_type_into_object_array(bool isAsync)
{
await base.Projection_of_entity_type_into_object_array(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]
WHERE [c].[CustomerID] LIKE N'A%'
ORDER BY [c].[CustomerID]");
}

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

AssertSql(
@"SELECT [o].[OrderID], [o].[CustomerID], [o].[EmployeeID], [o].[OrderDate], [c].[CustomerID], [c].[Address], [c].[City], [c].[CompanyName], [c].[ContactName], [c].[ContactTitle], [c].[Country], [c].[Fax], [c].[Phone], [c].[PostalCode], [c].[Region]
FROM [Orders] AS [o]
LEFT JOIN [Customers] AS [c] ON [o].[CustomerID] = [c].[CustomerID]
WHERE [o].[OrderID] < 10300
ORDER BY [o].[OrderID]");
}

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

0 comments on commit 59fbd88

Please sign in to comment.