Skip to content

Commit 32a8ee5

Browse files
authored
Expose EnsureStableOrdering property in ODataSettings object (#238)
* - Add possibility of disabling stable ordering. - Add possibility of disabling default order by clause. * fix tests * instead of adding the EnsureStableOrdering reuse the AlwaysSortByPrimaryKey To fix the problem, I fix the code where ordering by primary key was added even when AlwaysSortByPrimaryKey was disabled. * formatting
1 parent 11649ae commit 32a8ee5

File tree

3 files changed

+60
-1
lines changed

3 files changed

+60
-1
lines changed

AutoMapper.AspNetCore.OData.EFCore/LinqExtensions.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,9 @@ public static Expression GetQueryableMethod(this Expression expression,
196196
if (orderBySettings is null)
197197
return null;
198198

199+
if (oDataSettings?.AlwaysSortByPrimaryKey is false)
200+
return expression.GetSkipCall(skip).GetTakeCall(top);
201+
199202
return expression
200203
.GetDefaultOrderByCall(orderBySettings)
201204
.GetSkipCall(skip)

AutoMapper.AspNetCore.OData.EFCore/ODataSettings.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ public class ODataSettings
4141
/// Default is true.
4242
/// </value>
4343
public bool EnableConstantParameterization { get; set; } = true;
44-
44+
4545
/// <summary>
4646
/// If sets to true, orderBy pk desc will always be present on main entity.
4747
/// </summary>

AutoMapper.OData.EFCore.Tests/GetQueryTests.cs

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -896,6 +896,62 @@ void Test(IQueryable<CoreBuilding> queryable)
896896
}
897897
}
898898

899+
[Fact]
900+
public void BuildingsFilterNameWithTopAndDisabledAlwaysSortByPrimaryKey()
901+
{
902+
string query = "/corebuilding?$filter=contains(Name, 'Two L2')&$top=10";
903+
Test(GetQuery<CoreBuilding, TBuilding>(query, querySettings: new() { ODataSettings = new() { AlwaysSortByPrimaryKey = false } }));
904+
905+
void Test(IQueryable<CoreBuilding> queryable)
906+
{
907+
string sqlQuery = queryable.ToQueryString();
908+
Assert.Contains("TOP", sqlQuery);
909+
Assert.DoesNotContain("ORDER BY [o].[Identifier]", sqlQuery);
910+
}
911+
}
912+
913+
[Fact]
914+
public void BuildingsFilterNameWithTopAndEnabledAlwaysSortByPrimaryKey()
915+
{
916+
string query = "/corebuilding?$filter=contains(Name, 'Two L2')&$top=10";
917+
Test(GetQuery<CoreBuilding, TBuilding>(query, querySettings: new() { ODataSettings = new() { AlwaysSortByPrimaryKey = true } }));
918+
919+
void Test(IQueryable<CoreBuilding> queryable)
920+
{
921+
string sqlQuery = queryable.ToQueryString();
922+
Assert.Contains("TOP", sqlQuery);
923+
Assert.Contains("ORDER BY [o].[Identifier]", sqlQuery);
924+
}
925+
}
926+
927+
[Fact]
928+
public void BuildingsFilterNameWithSkipAndDisabledAlwaysSortByPrimaryKey()
929+
{
930+
string query = "/corebuilding?$filter=contains(Name, 'Two L2')&$skip=10";
931+
Test(GetQuery<CoreBuilding, TBuilding>(query, querySettings: new() { ODataSettings = new() { AlwaysSortByPrimaryKey = false } }));
932+
933+
void Test(IQueryable<CoreBuilding> queryable)
934+
{
935+
string sqlQuery = queryable.ToQueryString();
936+
Assert.Contains("OFFSET", sqlQuery);
937+
Assert.DoesNotContain("ORDER BY [o].[Identifier]", sqlQuery);
938+
}
939+
}
940+
941+
[Fact]
942+
public void BuildingsFilterNameWithSkipAndEnabledAlwaysSortByPrimaryKey()
943+
{
944+
string query = "/corebuilding?$filter=contains(Name, 'Two L2')&$skip=10";
945+
Test(GetQuery<CoreBuilding, TBuilding>(query, querySettings: new() { ODataSettings = new() { AlwaysSortByPrimaryKey = true } }));
946+
947+
void Test(IQueryable<CoreBuilding> queryable)
948+
{
949+
string sqlQuery = queryable.ToQueryString();
950+
Assert.Contains("OFFSET", sqlQuery);
951+
Assert.Contains("ORDER BY [o].[Identifier]", sqlQuery);
952+
}
953+
}
954+
899955
[Fact]
900956
public async Task OpsTenantOrderByCountOfReference()
901957
{

0 commit comments

Comments
 (0)