Skip to content

Commit

Permalink
Query: Avoid binding to parent QMV if projection is client side produ…
Browse files Browse the repository at this point in the history
…cing N+1 queries
  • Loading branch information
smitpatel committed Feb 9, 2017
1 parent 84ca0ff commit b8fb258
Show file tree
Hide file tree
Showing 4 changed files with 45 additions and 10 deletions.
Expand Up @@ -716,7 +716,7 @@ var selectExpression
RelationalQueryModelVisitor queryModelVisitor,
Func<RelationalQueryModelVisitor, AliasExpression> binder)
{
if (queryModelVisitor == null)
if (queryModelVisitor == null || queryModelVisitor.RequiresClientProjection)
{
return null;
}
Expand Down
Expand Up @@ -57,7 +57,7 @@ public virtual void Method_with_constant_queryable_arg()
}
}

private static IQueryable<Customer> QueryableArgQuery(NorthwindContext context, IQueryable<string> ids)
private static IQueryable<Customer> QueryableArgQuery(NorthwindContext context, IQueryable<string> ids)
=> context.Customers.Where(c => ids.Contains(c.CustomerID));

[ConditionalFact]
Expand Down Expand Up @@ -2183,6 +2183,27 @@ var efObjects
});
}

[ConditionalFact]
public virtual void Select_nested_collection_multi_level()
{
using (var context = CreateContext())
{
var customers = context.Customers
.Where(c => c.CustomerID.StartsWith("A"))
.Select(c => new
{
Orders = c.Orders
.Where(o => o.OrderID < 10500)
.Take(3)
.Select(o => new { Date = o.OrderDate })
})
.ToList();

Assert.Equal(4, customers.Count);
Assert.All(customers, t => Assert.True(t.Orders.Count() <= 3));
}
}

[ConditionalFact]
public virtual void Select_correlated_subquery_projection()
{
Expand Down
Expand Up @@ -576,17 +576,17 @@ public override void Collection_select_nav_prop_all_client()
FROM [Customers] AS [c]
ORDER BY [c].[CustomerID]
@_outer_CustomerID: ALFKI (Size = 450)
@_outer_CustomerID1: ALFKI (Size = 450)
SELECT [o1].[OrderID], [o1].[CustomerID], [o1].[EmployeeID], [o1].[OrderDate]
FROM [Orders] AS [o1]
WHERE @_outer_CustomerID = [o1].[CustomerID]
WHERE @_outer_CustomerID1 = [o1].[CustomerID]
@_outer_CustomerID: ANATR (Size = 450)
@_outer_CustomerID1: ANATR (Size = 450)
SELECT [o1].[OrderID], [o1].[CustomerID], [o1].[EmployeeID], [o1].[OrderDate]
FROM [Orders] AS [o1]
WHERE @_outer_CustomerID = [o1].[CustomerID]",
WHERE @_outer_CustomerID1 = [o1].[CustomerID]",
Sql);
}

Expand Down
Expand Up @@ -596,23 +596,23 @@ public override void Let_any_subquery_anonymous()
FROM [Customers] AS [c]
ORDER BY [c].[CustomerID]
@_outer_CustomerID: ALFKI (Size = 450)
@_outer_CustomerID1: ALFKI (Size = 450)
SELECT CASE
WHEN EXISTS (
SELECT 1
FROM [Orders] AS [o1]
WHERE [o1].[CustomerID] = @_outer_CustomerID)
WHERE [o1].[CustomerID] = @_outer_CustomerID1)
THEN CAST(1 AS BIT) ELSE CAST(0 AS BIT)
END
@_outer_CustomerID: ANATR (Size = 450)
@_outer_CustomerID1: ANATR (Size = 450)
SELECT CASE
WHEN EXISTS (
SELECT 1
FROM [Orders] AS [o1]
WHERE [o1].[CustomerID] = @_outer_CustomerID)
WHERE [o1].[CustomerID] = @_outer_CustomerID1)
THEN CAST(1 AS BIT) ELSE CAST(0 AS BIT)
END",
Sql);
Expand Down Expand Up @@ -5282,6 +5282,20 @@ public override void Select_nested_collection()
Sql);
}

public override void Select_nested_collection_multi_level()
{
base.Select_nested_collection_multi_level();

Assert.StartsWith(@"SELECT [c].[CustomerID]
FROM [Customers] AS [c]
WHERE [c].[CustomerID] LIKE N'A' + N'%' AND (CHARINDEX(N'A', [c].[CustomerID]) = 1)
SELECT [o].[CustomerID], [o].[OrderDate]
FROM [Orders] AS [o]
WHERE [o].[OrderID] < 10500",
Sql);
}

public override void Select_correlated_subquery_projection()
{
base.Select_correlated_subquery_projection();
Expand Down

0 comments on commit b8fb258

Please sign in to comment.