From 60ea5debb69b1833fbcf10d205a6cdc79578c033 Mon Sep 17 00:00:00 2001 From: Xavier Date: Fri, 28 Mar 2025 14:34:15 -0700 Subject: [PATCH] Fix compiler and update Odata sample --- .../Controllers/PeopleController.cs | 7 ++++++ .../OData/ODataBasicExample/Program.cs | 3 ++- .../ODataBasicExample/odatabasicexample.http | 22 +++++++++++++++++++ .../Conventions/ODataAttributeVisitor.cs | 2 +- .../OData/ODataApplicationModelProvider.cs | 6 ++--- .../ODataApiDescriptionProviderTest.cs | 4 ++-- .../DefaultApiControllerFilter.cs | 6 ++--- .../Conventions/ODataAttributeVisitor.cs | 4 ++-- 8 files changed, 42 insertions(+), 12 deletions(-) create mode 100644 examples/AspNetCore/OData/ODataBasicExample/odatabasicexample.http diff --git a/examples/AspNetCore/OData/ODataBasicExample/Controllers/PeopleController.cs b/examples/AspNetCore/OData/ODataBasicExample/Controllers/PeopleController.cs index 01d0c61e..ba41dd73 100644 --- a/examples/AspNetCore/OData/ODataBasicExample/Controllers/PeopleController.cs +++ b/examples/AspNetCore/OData/ODataBasicExample/Controllers/PeopleController.cs @@ -24,6 +24,13 @@ public IActionResult Get( ODataQueryOptions options ) => Email = "bill.mei@somewhere.com", Phone = "555-555-5555", }, + new() { + Id = 2, + FirstName = "Xavier", + LastName = "John", + Email = "xavier@heaven.com", + Phone = "666-666-6666", + } } ); // GET ~/api/people/{key}?api-version=[1.0|2.0] diff --git a/examples/AspNetCore/OData/ODataBasicExample/Program.cs b/examples/AspNetCore/OData/ODataBasicExample/Program.cs index a269f238..75368d1d 100644 --- a/examples/AspNetCore/OData/ODataBasicExample/Program.cs +++ b/examples/AspNetCore/OData/ODataBasicExample/Program.cs @@ -4,7 +4,8 @@ // Add services to the container. -builder.Services.AddControllers().AddOData(); +builder.Services.AddControllers() + .AddOData( options => options.Select().Filter().OrderBy().SetMaxTop( null ).Count() ); builder.Services.AddProblemDetails(); builder.Services.AddApiVersioning() .AddOData( diff --git a/examples/AspNetCore/OData/ODataBasicExample/odatabasicexample.http b/examples/AspNetCore/OData/ODataBasicExample/odatabasicexample.http new file mode 100644 index 00000000..fc4e3d34 --- /dev/null +++ b/examples/AspNetCore/OData/ODataBasicExample/odatabasicexample.http @@ -0,0 +1,22 @@ +@HostAddress = https://localhost:5001 + +// Get all records +GET {{HostAddress}}/api/People?api-version=1.0 +Accept: application/json +### + +// Get all records +GET {{HostAddress}}/api/People?api-version=1.0&$top=1 +Accept: application/json +### + +// Select firstName +GET {{HostAddress}}/api/People?api-version=1.0&$select=firstName +Accept: application/json +### + + +// By Key +GET {{HostAddress}}/api/People/5?api-version=1.0 +Accept: application/json +### \ No newline at end of file diff --git a/src/AspNet/OData/src/Asp.Versioning.WebApi.OData.ApiExplorer/Conventions/ODataAttributeVisitor.cs b/src/AspNet/OData/src/Asp.Versioning.WebApi.OData.ApiExplorer/Conventions/ODataAttributeVisitor.cs index 1c1a2f49..410f48ff 100644 --- a/src/AspNet/OData/src/Asp.Versioning.WebApi.OData.ApiExplorer/Conventions/ODataAttributeVisitor.cs +++ b/src/AspNet/OData/src/Asp.Versioning.WebApi.OData.ApiExplorer/Conventions/ODataAttributeVisitor.cs @@ -13,6 +13,6 @@ private void VisitAction( HttpActionDescriptor action ) var attributes = new List( controller.GetCustomAttributes( inherit: true ) ); attributes.AddRange( action.GetCustomAttributes( inherit: true ) ); - VisitEnableQuery( attributes ); + VisitEnableQuery( attributes.ToArray() ); } } \ No newline at end of file diff --git a/src/AspNetCore/OData/src/Asp.Versioning.OData/OData/ODataApplicationModelProvider.cs b/src/AspNetCore/OData/src/Asp.Versioning.OData/OData/ODataApplicationModelProvider.cs index 402da34d..8b567904 100644 --- a/src/AspNetCore/OData/src/Asp.Versioning.OData/OData/ODataApplicationModelProvider.cs +++ b/src/AspNetCore/OData/src/Asp.Versioning.OData/OData/ODataApplicationModelProvider.cs @@ -141,7 +141,7 @@ private static return (metadataControllers, supported, deprecated); } - private static ControllerModel? SelectBestMetadataController( IReadOnlyList controllers ) + private static ControllerModel? SelectBestMetadataController( ControllerModel[] controllers ) { // note: there should be at least 2 metadata controllers, but there could be 3+ // if a developer defines their own custom controller. ultimately, there can be @@ -154,7 +154,7 @@ private static var original = typeof( MetadataController ).GetTypeInfo(); var versioned = typeof( VersionedMetadataController ).GetTypeInfo(); - for ( var i = 0; i < controllers.Count; i++ ) + for ( var i = 0; i < controllers.Length; i++ ) { var controller = controllers[i]; @@ -192,7 +192,7 @@ private void ApplyMetadataControllerConventions( return; } - var metadataController = SelectBestMetadataController( metadataControllers ); + var metadataController = SelectBestMetadataController( metadataControllers.ToArray() ); if ( metadataController == null ) { diff --git a/src/AspNetCore/OData/test/Asp.Versioning.OData.ApiExplorer.Tests/ApiExplorer/ODataApiDescriptionProviderTest.cs b/src/AspNetCore/OData/test/Asp.Versioning.OData.ApiExplorer.Tests/ApiExplorer/ODataApiDescriptionProviderTest.cs index 511513b4..532abb00 100644 --- a/src/AspNetCore/OData/test/Asp.Versioning.OData.ApiExplorer.Tests/ApiExplorer/ODataApiDescriptionProviderTest.cs +++ b/src/AspNetCore/OData/test/Asp.Versioning.OData.ApiExplorer.Tests/ApiExplorer/ODataApiDescriptionProviderTest.cs @@ -256,9 +256,9 @@ private static void AssertQueryOptionWithoutOData( ApiDescription description, s parameter.ModelMetadata.Description.Should().EndWith( suffix + '.' ); } - private void PrintGroup( IReadOnlyList items ) + private void PrintGroup( ApiDescription[] items ) { - for ( var i = 0; i < items.Count; i++ ) + for ( var i = 0; i < items.Length; i++ ) { var item = items[i]; console.WriteLine( $"[{item.GroupName}] {item.HttpMethod} {item.RelativePath}" ); diff --git a/src/AspNetCore/WebApi/src/Asp.Versioning.Mvc/ApplicationModels/DefaultApiControllerFilter.cs b/src/AspNetCore/WebApi/src/Asp.Versioning.Mvc/ApplicationModels/DefaultApiControllerFilter.cs index e8d851be..8ab501c7 100644 --- a/src/AspNetCore/WebApi/src/Asp.Versioning.Mvc/ApplicationModels/DefaultApiControllerFilter.cs +++ b/src/AspNetCore/WebApi/src/Asp.Versioning.Mvc/ApplicationModels/DefaultApiControllerFilter.cs @@ -10,7 +10,7 @@ namespace Asp.Versioning.ApplicationModels; [CLSCompliant( false )] public sealed class DefaultApiControllerFilter : IApiControllerFilter { - private readonly IReadOnlyList specifications; + private readonly IApiControllerSpecification[] specifications; /// /// Initializes a new instance of the class. @@ -24,7 +24,7 @@ public DefaultApiControllerFilter( IEnumerable spec /// public IList Apply( IList controllers ) { - if ( specifications.Count == 0 ) + if ( specifications.Length == 0 ) { return controllers; } @@ -44,7 +44,7 @@ public IList Apply( IList controllers ) private bool IsApiController( ControllerModel controller ) { - for ( var i = 0; i < specifications.Count; i++ ) + for ( var i = 0; i < specifications.Length; i++ ) { if ( specifications[i].IsSatisfiedBy( controller ) ) { diff --git a/src/Common/src/Common.OData.ApiExplorer/Conventions/ODataAttributeVisitor.cs b/src/Common/src/Common.OData.ApiExplorer/Conventions/ODataAttributeVisitor.cs index 7cb50224..2f58f340 100644 --- a/src/Common/src/Common.OData.ApiExplorer/Conventions/ODataAttributeVisitor.cs +++ b/src/Common/src/Common.OData.ApiExplorer/Conventions/ODataAttributeVisitor.cs @@ -76,11 +76,11 @@ private void VisitModel( IEdmStructuredType modelType ) VisitMaxTop( querySettings ); } - private void VisitEnableQuery( IReadOnlyList attributes ) + private void VisitEnableQuery(EnableQueryAttribute[] attributes ) { var @default = new EnableQueryAttribute(); - for ( var i = 0; i < attributes.Count; i++ ) + for ( var i = 0; i < attributes.Length; i++ ) { var attribute = attributes[i];