in src/Microsoft.OpenApi.OData.Reader/Generator/OpenApiParameterGenerator.cs [369:427]
public static OpenApiParameter CreateOrderBy(this ODataContext context, IEdmVocabularyAnnotatable target, IEdmStructuredType structuredType)
{
Utils.CheckArgumentNull(context, nameof(context));
Utils.CheckArgumentNull(target, nameof(target));
Utils.CheckArgumentNull(structuredType, nameof(structuredType));
SortRestrictionsType sort = context.Model.GetRecord<SortRestrictionsType>(target, CapabilitiesConstants.SortRestrictions);
if (sort != null && !sort.IsSortable)
{
return null;
}
IList<IOpenApiAny> orderByItems = new List<IOpenApiAny>();
foreach (var property in structuredType.StructuralProperties())
{
if (sort != null && sort.IsNonSortableProperty(property.Name))
{
continue;
}
bool isAscOnly = sort != null && sort.IsAscendingOnlyProperty(property.Name);
bool isDescOnly = sort != null && sort.IsDescendingOnlyProperty(property.Name);
if (isAscOnly || isDescOnly)
{
if (isAscOnly)
{
orderByItems.Add(new OpenApiString(property.Name));
}
else
{
orderByItems.Add(new OpenApiString(property.Name + " desc"));
}
}
else
{
orderByItems.Add(new OpenApiString(property.Name));
orderByItems.Add(new OpenApiString(property.Name + " desc"));
}
}
return new OpenApiParameter
{
Name = "$orderby",
In = ParameterLocation.Query,
Description = "Order items by property values",
Schema = new OpenApiSchema
{
Type = "array",
UniqueItems = true,
Items = new OpenApiSchema
{
Type = "string",
Enum = orderByItems
}
},
Style = ParameterStyle.Form,
Explode = false
};
}