ASP.NET Core OData中EnsureStableOrdering=false无法阻止导航实体默认排序
解决方案:阻止ASP.NET Core OData导航实体的默认排序
问题根源在于:当设置PageSize时,OData默认会为所有需要处理的集合(包括通过$expand加载的导航集合)启用稳定排序以保证分页一致性,且导航集合的查询设置不会自动继承主实体的EnsureStableOrdering配置。要解决这个问题,需要显式为导航属性指定查询设置,覆盖默认行为。
修改自定义EnableQueryAttribute代码
在创建ODataQuerySettings时,通过NavigationSettings为所有导航属性设置EnsureStableOrdering = false,确保导航集合也遵循禁用稳定排序的规则:
public class CustomEnableQuery : EnableQueryAttribute { private static int _pageSize; static CustomEnableQuery() { var configuration = new ConfigurationBuilder() .AddJsonFile("appsettings.json") .Build(); _pageSize = Convert.ToInt32(configuration["pagesize"]); } public override IQueryable ApplyQuery(IQueryable queryable, ODataQueryOptions queryOptions) { var querySettings = new ODataQuerySettings { PageSize = _pageSize, EnsureStableOrdering = false, IgnoredQueryOptions = AllowedQueryOptions.Skip }; // 为所有导航属性应用禁用稳定排序的设置 querySettings.NavigationSettings.Add("*", new ODataQuerySettings { EnsureStableOrdering = false, // 若不需要对导航集合分页,可设置为null避免自动分页触发排序 PageSize = null }); var result = queryOptions.ApplyTo(queryable, querySettings); return result; } }
关键说明
NavigationSettings.Add("*", ...)中的通配符*表示对所有导航属性生效,若只需针对特定导航集合,可替换为具体的导航属性名称(如"Orders")。- 若导航集合不需要分页,设置
PageSize = null可以进一步避免OData因分页需求自动添加排序逻辑。 - 该方案同时保证主实体和导航集合都遵循
EnsureStableOrdering = false的配置,解决了仅主实体生效的问题。
内容的提问来源于stack exchange,提问作者Nivash RK
相关产品推荐
相关产品推荐

