diff --git a/src/EFCore.Relational/Query/Expressions/SelectExpression.cs b/src/EFCore.Relational/Query/Expressions/SelectExpression.cs index d1b23aacd15..6b33e4a642e 100644 --- a/src/EFCore.Relational/Query/Expressions/SelectExpression.cs +++ b/src/EFCore.Relational/Query/Expressions/SelectExpression.cs @@ -204,7 +204,8 @@ public virtual Expression Offset [param: CanBeNull] set { - if (_limit != null + if ((_limit != null + || _offset != null) && value != null) { PushDownSubquery(); diff --git a/src/EFCore.Specification.Tests/Query/SimpleQueryTestBase.cs b/src/EFCore.Specification.Tests/Query/SimpleQueryTestBase.cs index 28e6c192c8b..0df925f4b56 100644 --- a/src/EFCore.Specification.Tests/Query/SimpleQueryTestBase.cs +++ b/src/EFCore.Specification.Tests/Query/SimpleQueryTestBase.cs @@ -3228,6 +3228,19 @@ public virtual void OrderBy_skip_take() entryCount: 8); } + [ConditionalFact] + public virtual void OrderBy_skip_skip_take() + { + AssertQuery( + cs => cs.OrderBy(c => c.ContactTitle) + .ThenBy(c => c.ContactName) + .Skip(5) + .Skip(8) + .Take(3), + assertOrder: true, + entryCount: 3); + } + [ConditionalFact] public virtual void OrderBy_skip_take_take() { diff --git a/test/EFCore.SqlServer.FunctionalTests/Query/RowNumberPagingTest.cs b/test/EFCore.SqlServer.FunctionalTests/Query/RowNumberPagingTest.cs index 8abb0323470..2731a6febe5 100644 --- a/test/EFCore.SqlServer.FunctionalTests/Query/RowNumberPagingTest.cs +++ b/test/EFCore.SqlServer.FunctionalTests/Query/RowNumberPagingTest.cs @@ -253,6 +253,30 @@ public override void OrderBy_skip_take() WHERE ([t].[__RowNumber__] > @__p_0) AND ([t].[__RowNumber__] <= (@__p_0 + @__p_1))"); } + public override void OrderBy_skip_skip_take() + { + base.OrderBy_skip_skip_take(); + + AssertSql( + @"@__p_0='5' +@__p_1='8' +@__p_2='3' + +SELECT [t1].* +FROM ( + SELECT [t].*, ROW_NUMBER() OVER(ORDER BY [t].[ContactTitle], [t].[ContactName]) AS [__RowNumber__1] + FROM ( + SELECT [t0].[CustomerID], [t0].[Address], [t0].[City], [t0].[CompanyName], [t0].[ContactName], [t0].[ContactTitle], [t0].[Country], [t0].[Fax], [t0].[Phone], [t0].[PostalCode], [t0].[Region] + FROM ( + SELECT [c].[CustomerID], [c].[Address], [c].[City], [c].[CompanyName], [c].[ContactName], [c].[ContactTitle], [c].[Country], [c].[Fax], [c].[Phone], [c].[PostalCode], [c].[Region], ROW_NUMBER() OVER(ORDER BY [c].[ContactTitle], [c].[ContactName]) AS [__RowNumber__] + FROM [Customers] AS [c] + ) AS [t0] + WHERE [t0].[__RowNumber__] > @__p_0 + ) AS [t] +) AS [t1] +WHERE ([t1].[__RowNumber__1] > @__p_1) AND ([t1].[__RowNumber__1] <= (@__p_1 + @__p_2))"); + } + public override void OrderBy_skip_take_take() { base.OrderBy_skip_take_take(); diff --git a/test/EFCore.SqlServer.FunctionalTests/Query/SimpleQuerySqlServerTest.cs b/test/EFCore.SqlServer.FunctionalTests/Query/SimpleQuerySqlServerTest.cs index d310435d635..e887016eb67 100644 --- a/test/EFCore.SqlServer.FunctionalTests/Query/SimpleQuerySqlServerTest.cs +++ b/test/EFCore.SqlServer.FunctionalTests/Query/SimpleQuerySqlServerTest.cs @@ -3181,6 +3181,27 @@ public override void OrderBy_skip_take() OFFSET @__p_0 ROWS FETCH NEXT @__p_1 ROWS ONLY"); } + [SqlServerCondition(SqlServerCondition.SupportsOffset)] + public override void OrderBy_skip_skip_take() + { + base.OrderBy_skip_skip_take(); + + AssertSql( + @"@__p_0='5' +@__p_1='8' +@__p_2='3' + +SELECT [t].* +FROM ( + 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] + ORDER BY [c].[ContactTitle], [c].[ContactName] + OFFSET @__p_0 ROWS +) AS [t] +ORDER BY [t].[ContactTitle], [t].[ContactName] +OFFSET @__p_1 ROWS FETCH NEXT @__p_2 ROWS ONLY"); + } + [SqlServerCondition(SqlServerCondition.SupportsOffset)] public override void OrderBy_skip_take_take() {