diff --git a/AutoMapper.AspNetCore.OData.EFCore/LinqExtensions.cs b/AutoMapper.AspNetCore.OData.EFCore/LinqExtensions.cs
index 84cf8c7..b8948de 100644
--- a/AutoMapper.AspNetCore.OData.EFCore/LinqExtensions.cs
+++ b/AutoMapper.AspNetCore.OData.EFCore/LinqExtensions.cs
@@ -196,6 +196,9 @@ public static Expression GetQueryableMethod(this Expression expression,
if (orderBySettings is null)
return null;
+ if (oDataSettings?.AlwaysSortByPrimaryKey is false)
+ return expression.GetSkipCall(skip).GetTakeCall(top);
+
return expression
.GetDefaultOrderByCall(orderBySettings)
.GetSkipCall(skip)
diff --git a/AutoMapper.AspNetCore.OData.EFCore/ODataSettings.cs b/AutoMapper.AspNetCore.OData.EFCore/ODataSettings.cs
index b74111c..b1ec176 100644
--- a/AutoMapper.AspNetCore.OData.EFCore/ODataSettings.cs
+++ b/AutoMapper.AspNetCore.OData.EFCore/ODataSettings.cs
@@ -41,7 +41,7 @@ public class ODataSettings
/// Default is true.
///
public bool EnableConstantParameterization { get; set; } = true;
-
+
///
/// If sets to true, orderBy pk desc will always be present on main entity.
///
diff --git a/AutoMapper.OData.EFCore.Tests/GetQueryTests.cs b/AutoMapper.OData.EFCore.Tests/GetQueryTests.cs
index 39e1a92..ce07465 100644
--- a/AutoMapper.OData.EFCore.Tests/GetQueryTests.cs
+++ b/AutoMapper.OData.EFCore.Tests/GetQueryTests.cs
@@ -896,6 +896,62 @@ void Test(IQueryable queryable)
}
}
+ [Fact]
+ public void BuildingsFilterNameWithTopAndDisabledAlwaysSortByPrimaryKey()
+ {
+ string query = "/corebuilding?$filter=contains(Name, 'Two L2')&$top=10";
+ Test(GetQuery(query, querySettings: new() { ODataSettings = new() { AlwaysSortByPrimaryKey = false } }));
+
+ void Test(IQueryable queryable)
+ {
+ string sqlQuery = queryable.ToQueryString();
+ Assert.Contains("TOP", sqlQuery);
+ Assert.DoesNotContain("ORDER BY [o].[Identifier]", sqlQuery);
+ }
+ }
+
+ [Fact]
+ public void BuildingsFilterNameWithTopAndEnabledAlwaysSortByPrimaryKey()
+ {
+ string query = "/corebuilding?$filter=contains(Name, 'Two L2')&$top=10";
+ Test(GetQuery(query, querySettings: new() { ODataSettings = new() { AlwaysSortByPrimaryKey = true } }));
+
+ void Test(IQueryable queryable)
+ {
+ string sqlQuery = queryable.ToQueryString();
+ Assert.Contains("TOP", sqlQuery);
+ Assert.Contains("ORDER BY [o].[Identifier]", sqlQuery);
+ }
+ }
+
+ [Fact]
+ public void BuildingsFilterNameWithSkipAndDisabledAlwaysSortByPrimaryKey()
+ {
+ string query = "/corebuilding?$filter=contains(Name, 'Two L2')&$skip=10";
+ Test(GetQuery(query, querySettings: new() { ODataSettings = new() { AlwaysSortByPrimaryKey = false } }));
+
+ void Test(IQueryable queryable)
+ {
+ string sqlQuery = queryable.ToQueryString();
+ Assert.Contains("OFFSET", sqlQuery);
+ Assert.DoesNotContain("ORDER BY [o].[Identifier]", sqlQuery);
+ }
+ }
+
+ [Fact]
+ public void BuildingsFilterNameWithSkipAndEnabledAlwaysSortByPrimaryKey()
+ {
+ string query = "/corebuilding?$filter=contains(Name, 'Two L2')&$skip=10";
+ Test(GetQuery(query, querySettings: new() { ODataSettings = new() { AlwaysSortByPrimaryKey = true } }));
+
+ void Test(IQueryable queryable)
+ {
+ string sqlQuery = queryable.ToQueryString();
+ Assert.Contains("OFFSET", sqlQuery);
+ Assert.Contains("ORDER BY [o].[Identifier]", sqlQuery);
+ }
+ }
+
[Fact]
public async Task OpsTenantOrderByCountOfReference()
{