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() {