OData Function & Action Kullanımı

asp-net-core-api-odata

Bu yazımıza kadar Open Data ile seçme, filtreleme, ekleme, güncelleme, silme gibi işlemleri gerçekleştirdik. Bazı durumlarda direk olarak tanımladığımız EntitySet ile ilgili olmayan işlemler de gerçekleştirmek isteyebiliriz. OData bu gibi durumları gerçekleştirmek için bize Action ve Function isimli iki seçenek sunuyor. OData yazı serisi boyunca kullanmış olduğum projeye buradan erişebilirsin.

Microsoft resmi dökümantasyonu Action ve Function arasındaki farkı; bir Action yan etkiye (side effect) sahip olabilirken, Function’da böyle bir durum olmadığını belirleterek açıklıyor.

OData Actions

OData Action‘larını HTTP üzerinden POST metoduyla tetikliyoruz. Bir parametresi olabilir veya bir değer döndürebilirler. Bu bilgileri EdmModel içerisinde tanımlıyoruz. Action‘ları; karmaşık işlemleri (transactions), birden fazla varlığı (entity) aynı anda manipüle etmek, sadece istediğimiz alanları güncellemek istediğimizde, bir varlıkla (entity) ilişkisi olmayan bir bilgiyi almak için kullanabiliriz.

Örneğin: bir üreticiye bağlı toplam araç sayısını çekeceğimiz bir action yazmak istediğimizi varsayalım, EdmModel‘imize action bildirimini yaparak başlayalım.

Burada Category varlığımıza (entity) TotalVehiclesByCategory isminde method tanımladığımızı ve yapacağımız işlemler sonunda int tipinde değer döneceğimizi belirtiyoruz. Şimdi controller sınıfımızda denk düşen action methodumuzu yazalım.

https://localhost:44357/odata/categories(2)/totalvehiclesbycategory adresine POST isteği attığımızda sonucun geldiğini göreceğiz.

odata-action-method

Şimdi de bir kayıtla ilgili değil, direk kolleksiyon (collection) üzerinden bir örnek yapalım. Atacağımız POST isteği sonucu kategori sayısını bize dönsün. Yine EdmModel üzerinde methodumuzu tanımlayalım.

Controller sınıfımızda action methodumuzu yazalım.

https://localhost:44357/odata/categories/totalcategorycount adresine istek attığımızda kategori sayımızın geldiğini göreceğiz.

Şimdi de belirli bir kategori ve üreticiye göre araç sayılarını almak istediğimizi düşünelim. EdmModel‘imize tanımlamamızı yapıyoruz.

Controller sınıfımızda ilgili action methoduzu yazalım.

Dikkat ederseniz POST metodu gövdesindeki verileri ODataActionParameters üzerinden aldığımızı göreceksin, gelen veriler Dictionary<string, string> tipinde olacaktır.

İsteğimizi https://localhost:44357/odata/categories(1)/vehiclesbymanufacturer adresine yukarıdaki gövdeyle gönderdiğimizde sonucun geldiğini göreceğiz.

Şimdi ise birden fazla primitive tip alan bir örnek yapalım. Yukarıdaki örneğimize yıl parametresini de ekleyelim. Buna göre bir kategori ve üreticinin gönderdiğimiz üretim yılındaki araç sayılarının sayısını elde edelim. EdmModel‘imize tanımlamaları yapıyoruz.

Controller sınıfımızda action methodumuzu yazıp POST isteğimizi aşağıdaki bilgiyle gönderelim.

https://localhost:44357/odata/categories(1)/vehiclecountbyyearmanufacturer adresine istek attığımızda verimizin geldiğini göreceğiz.

Function başlığına geçmeden önce primitive tip yerine reference tipinde bir parametre alan son bir örnek yapalım. Belirtilen kategori ve belli bir üreticiye ait araçlardan göndereceğimiz motor gücünden yüksek olan araç sayısını isteyelim. Referans (reference) tipimizi tanımlıyor ve EdmModel‘e action bildirimini yapıyoruz.

Controller sınıfımızda da action methodumuzu yazalım.

Aşağıdaki veriyi https://localhost:44357/odata/categories(1)/vehiclehpbymanufacturer adresine POST ettiğimizde istediğimiz verinin geldiğini göreceğiz.

OData Functions

OData iki tür fonksiyonu destekler. Function‘ları da neredeyse Action‘lar ile aynı şekilde tanımlıyoruz. Function’ların, Action’un aksine HTTP üzerinde GET ile çalıştığını unutmamak gerekir.

OData Bound Functions

Bound Function‘lar bir varlık (entity) ya da kolleksiyonla (collection) doğrudan ilişkisi olmayan bilgileri döndürmek için tercih edilir.

Kategori bazında kaç adet aracımız olduğunu döndüren function‘ımızı yazalım. Yine EdmModel üzerinde function methodumuzu ve dönüş tipimizi tanımlıyoruz.

Controller sınıfımızda karşılık gelen action methodumuzu yazalım.

https://localhost:44357/odata/categories/vehiclecounts adresine GET isteği yaptığımızda sonucun geldiğini göreceğiz.

odata-functions

Örneğin: belirli kategori ve üreticiye ilişkin belirli bir üretim yılı üstündeki araçların kaç yaşında olduğu bilgisini dönen başka bir function yazalım. Dönüş tip tanımını ve EdmModel bildirimizi yapıyoruz.

Controller sınıfımızda karşılık gelen action methodumuzu yazalım.

https://localhost:44357/odata/categories(1)/calculatevehicleage(ManufacturerId=1,Year=2000) adresine istek attığımızda verinin geldiğini göreceğiz. CalculateVehicleAge fonksiyonunu url üzerinden nasıl çağırdığımıza dikkat edin, OData Function‘larını bu şekilde çağırıyoruz.

odata-bound-function

OData Unbound Functions

Unbound Function’lar normalde bir servise bağlı olmadan servisteki static operasyonlar olarak görev alırlar. Bir parametre alabilir veya almayabilirler.

Örneğin: ülkeye göre vergi oranlarını dönecek bir unbound function yazalım. Edm tanımlamamızı yaparak işleme başlayalım ve ardından controller sınıfımızda action methodumuzu yazalım.

https://localhost:44357/odata/GetTaxRateByCountry(Country=’Turkey’) adresine istek attığımızda sonucun geldiğini göreceğiz.

odata-unbound-function

Bir sonraki yazı OData Connected Services ile görüşmek dileğiyle.

You may also like...

Bir cevap yazın

E-posta hesabınız yayımlanmayacak.