Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions AutoMapper.AspNetCore.OData.EFCore/LinqExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
2 changes: 1 addition & 1 deletion AutoMapper.AspNetCore.OData.EFCore/ODataSettings.cs
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ public class ODataSettings
/// Default is true.
/// </value>
public bool EnableConstantParameterization { get; set; } = true;

/// <summary>
/// If sets to true, orderBy pk desc will always be present on main entity.
/// </summary>
Expand Down
56 changes: 56 additions & 0 deletions AutoMapper.OData.EFCore.Tests/GetQueryTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -896,6 +896,62 @@ void Test(IQueryable<CoreBuilding> queryable)
}
}

[Fact]
public void BuildingsFilterNameWithTopAndDisabledAlwaysSortByPrimaryKey()
{
string query = "/corebuilding?$filter=contains(Name, 'Two L2')&$top=10";
Test(GetQuery<CoreBuilding, TBuilding>(query, querySettings: new() { ODataSettings = new() { AlwaysSortByPrimaryKey = false } }));

void Test(IQueryable<CoreBuilding> 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<CoreBuilding, TBuilding>(query, querySettings: new() { ODataSettings = new() { AlwaysSortByPrimaryKey = true } }));

void Test(IQueryable<CoreBuilding> 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<CoreBuilding, TBuilding>(query, querySettings: new() { ODataSettings = new() { AlwaysSortByPrimaryKey = false } }));

void Test(IQueryable<CoreBuilding> 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<CoreBuilding, TBuilding>(query, querySettings: new() { ODataSettings = new() { AlwaysSortByPrimaryKey = true } }));

void Test(IQueryable<CoreBuilding> queryable)
{
string sqlQuery = queryable.ToQueryString();
Assert.Contains("OFFSET", sqlQuery);
Assert.Contains("ORDER BY [o].[Identifier]", sqlQuery);
}
}

[Fact]
public async Task OpsTenantOrderByCountOfReference()
{
Expand Down