Skip to content

Commit

Permalink
Query: Skip/Take with Any/All should preserve skip/take
Browse files Browse the repository at this point in the history
  • Loading branch information
smitpatel committed Oct 22, 2016
1 parent 17ae9de commit 4b36173
Show file tree
Hide file tree
Showing 4 changed files with 74 additions and 16 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -298,9 +298,10 @@ public virtual Expression Limit
[param: CanBeNull]
set
{
Check.NotNull(value, nameof(value));

PushDownIfLimit();
if (value != null)
{
PushDownIfLimit();
}

_limit = value;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -173,7 +173,7 @@ var handlerContext

private static Expression HandleAll(HandlerContext handlerContext)
{
var sqlTranslatingVisitor
var sqlTranslatingVisitor
= handlerContext.CreateSqlTranslatingVisitor(bindParentQueries: true);

var predicate
Expand All @@ -182,19 +182,21 @@ var predicate

if (predicate != null)
{
var innerSelectExpression
= handlerContext.SelectExpressionFactory
.Create(handlerContext.QueryModelVisitor.QueryCompilationContext);
var innerSelectExpression = handlerContext.SelectExpression.Clone();

innerSelectExpression.AddTables(handlerContext.SelectExpression.Tables);
innerSelectExpression.Predicate = Expression.Not(predicate);
innerSelectExpression.ClearProjection();
innerSelectExpression.AddToProjection(Expression.Constant(1));

if (handlerContext.SelectExpression.Predicate != null)
{
innerSelectExpression.Predicate
= Expression.AndAlso(
handlerContext.SelectExpression.Predicate,
innerSelectExpression.Predicate);
Expression.Not(predicate));
}
else
{
innerSelectExpression.Predicate = Expression.Not(predicate);
}

SetProjectionConditionalExpression(
Expand All @@ -213,12 +215,11 @@ var innerSelectExpression

private static Expression HandleAny(HandlerContext handlerContext)
{
var innerSelectExpression
= handlerContext.SelectExpressionFactory
.Create(handlerContext.QueryModelVisitor.QueryCompilationContext);
var innerSelectExpression
= handlerContext.SelectExpression.Clone();

innerSelectExpression.AddTables(handlerContext.SelectExpression.Tables);
innerSelectExpression.Predicate = handlerContext.SelectExpression.Predicate;
innerSelectExpression.ClearProjection();
innerSelectExpression.AddToProjection(Expression.Constant(1));

SetProjectionConditionalExpression(
handlerContext,
Expand Down Expand Up @@ -677,7 +678,7 @@ private static Expression HandleSkip(HandlerContext handlerContext)
{
var skipResultOperator = (SkipResultOperator)handlerContext.ResultOperator;

var sqlTranslatingExpressionVisitor
var sqlTranslatingExpressionVisitor
= handlerContext.CreateSqlTranslatingVisitor(bindParentQueries: true);

var offset = sqlTranslatingExpressionVisitor.Visit(skipResultOperator.Count);
Expand Down Expand Up @@ -734,6 +735,8 @@ private static void SetProjectionConditionalExpression(
handlerContext.SelectExpression.SetProjectionConditionalExpression(conditionalExpression);
handlerContext.SelectExpression.ClearTables();
handlerContext.SelectExpression.ClearOrderBy();
handlerContext.SelectExpression.Offset = null;
handlerContext.SelectExpression.Limit = null;
handlerContext.SelectExpression.Predicate = null;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -356,6 +356,20 @@ public virtual void Skip_Take_Distinct()
entryCount: 10);
}

[ConditionalFact]
public virtual void Skip_Take_Any()
{
AssertQuery<Customer>(
cs => cs.OrderBy(c => c.ContactName).Skip(5).Take(10).Any());
}

[ConditionalFact]
public virtual void Skip_Take_All()
{
AssertQuery<Customer>(
cs => cs.OrderBy(c => c.ContactName).Skip(5).Take(10).All(p => p.CustomerID.Length == 5));
}

[ConditionalFact]
public virtual void Take_Skip_Distinct()
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3657,6 +3657,46 @@ public override void Distinct_Scalar()
[SqlServerCondition(SqlServerCondition.SupportsOffset)]
public override void Skip_Take_Distinct() => base.Skip_Take_Distinct();

[SqlServerCondition(SqlServerCondition.SupportsOffset)]
public override void Skip_Take_Any()
{
base.Skip_Take_Any();

Assert.Equal(
@"@__p_0: 5
@__p_1: 10
SELECT CASE
WHEN EXISTS (
SELECT 1
FROM [Customers] AS [c]
ORDER BY [c].[ContactName]
OFFSET @__p_0 ROWS FETCH NEXT @__p_1 ROWS ONLY)
THEN CAST(1 AS BIT) ELSE CAST(0 AS BIT)
END",
Sql);
}

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

Assert.Equal(
@"@__p_0: 5
@__p_1: 10
SELECT CASE
WHEN NOT EXISTS (
SELECT 1
FROM [Customers] AS [c]
WHERE LEN([c].[CustomerID]) <> 5
ORDER BY [c].[ContactName]
OFFSET @__p_0 ROWS FETCH NEXT @__p_1 ROWS ONLY)
THEN CAST(1 AS BIT) ELSE CAST(0 AS BIT)
END",
Sql);
}

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

0 comments on commit 4b36173

Please sign in to comment.