Saya mengalami kesulitan mendapatkan OData untuk bekerja dalam solusi .NET Core WebAPI baru (.NET 5.0).

Saya mendapatkan data kembali melalui "/api/entity" standar dan menggunakan filter khusus, tetapi saya lebih suka menggunakan fitur $select, $filter, $count, $metadata, dll. bawaan OData.

Saya telah menambahkan paket nuget untuk Microsoft.AspNetCore.OData v7.5.8, dan menambahkan yang berikut ini ke Startup.cs saya:

ConfigureServices()...    
services.AddOData();
    
Configure()...
endpoints.MapODataRoute("odata", "odata", GetEdmModel()).Select().Filter().Expand().Count();

Dan metode Model EDM:

private static IEdmModel GetEdmModel()
        {
            ODataConventionModelBuilder builder = new();
            builder.EntitySet<Event>("Events");
            return builder.GetEdmModel();
        }

Semuanya dikompilasi, dan jika saya menekan [rooturl]/odata, saya melihat entitas saya, jadi saya melihatnya pada dasarnya berfungsi (saya pikir).

Namun jika saya pergi ke: [rooturl]/odata/events(1) Saya mendapatkan halaman tidak ditemukan... namun jika saya menggunakan rute default [rooturl]/api/events/1, itu bekerja dengan sempurna.

Ini adalah .NET Core WebAPI pertama saya, setelah membangun solusi .NET Standard WebForms, WCF, MVC, dan WebAPI yang tak terhitung jumlahnya. Saya yakin saya hanya melewatkan sesuatu yang sederhana... tapi saya tidak tahu apa.

Saya ingin dapat menggunakan OData seperti ini:

[rooturl]/odata/Events?$top=10
[rooturl]/odata/Events?$filter=name eq "foo"
[rooturl]/odata/Events?$select=id,name,status

Di .NET Standard MVC, fungsionalitas OData langsung tersedia. Bagaimana saya mendapatkannya dengan .NET Core?

Adakah yang punya saran tentang apa yang harus ditambahkan untuk memasang kabel ini dengan benar?

Banyak terima kasih sebelumnya.

0
Alex A 20 Mei 2021, 00:18

1 menjawab

Jawaban Terbaik

Setelah merujuk ke salah satu solusi WebAPI lama saya (.NET Framework 4.8 MVC), saya menemukan jawabannya. Untungnya, sebagian besar pola lama masih berfungsi di .NET Core.

Memposting solusi untuk mereka yang mungkin mengalami masalah yang sama.

Startup.cs membutuhkan kode berikut:

ConfigureServices()...
services.AddOData();

Configure()...
// removed app.UseUseMvc()...replaced with this...

app.UseEndpoints(endpoints =>
{
    //endpoints.EnableDependencyInjection();
    endpoints.Select()
             .OrderBy()
             .Filter()
             .SkipToken()
             .MaxTop(null)
             .Expand()
             .Count();
    endpoints.MapODataRoute("api", "api", GetEdmModel());
});

GetEdmModel()...
ODataConventionModelBuilder builder = new();
var events = builder.EntitySet<Events>("Events");            
return builder.GetEdmModel();

Pada pengontrol:

Tambahkan anotasi [EnableQuery] ke metode. Setel output ke IQueryable<Events> (dan pastikan Anda mengembalikan koleksi AsQueryable().

Itu berhasil dan sekarang saya melihat semua opsi OData yang saya butuhkan untuk koleksi ini.

0
Alex A 20 Mei 2021, 02:18