﻿
{"id":15992,"date":"2020-05-19T18:32:18","date_gmt":"2020-05-19T18:32:18","guid":{"rendered":"https:\/\/www.gencayyildiz.com\/blog\/?p=15992"},"modified":"2020-05-19T18:32:18","modified_gmt":"2020-05-19T18:32:18","slug":"odata-davranis-modellemesi-ve-attributelari","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/odata-davranis-modellemesi-ve-attributelari\/","title":{"rendered":"OData Davran\u0131\u015f Modellemesi ve Attributelar\u0131"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p>Merhaba,<\/p>\n<p>OData protokol\u00fcne dair \u00f6nceden kaleme alm\u0131\u015f oldu\u011fumuz <a href=\"https:\/\/www.gencayyildiz.com\/blog\/category\/odata\/\" rel=\"noopener noreferrer\" target=\"_blank\">makaleler<\/a>imizden g\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere, OData; controllerlar\u0131n y\u00f6netimini ele almakta ve belirli varsay\u0131lan standartlar \u00fczerine yap\u0131lanmay\u0131 in\u015fa etmektedir. \u0130\u015fte bu i\u00e7eri\u011fimizde OData&#8217;n\u0131n varsay\u0131msal standartlar\u0131n\u0131 inceleyecek ve bir nebze \u00f6zelle\u015ftirme dokunu\u015flar\u0131nda bulunaca\u011f\u0131z.<\/p>\n<h3>OData Controller Yap\u0131lanmas\u0131<\/h3>\n<p>OData protokol\u00fc \u00fczerinden sorgulama yap\u0131labilecek bir controller modeli i\u00e7in a\u015fa\u011f\u0131daki \u00f6rne\u011fi ele al\u0131rsak e\u011fer;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public class PersonelController : ODataController\r\n    {\r\n        NorthwindContext _northwindContext;\r\n        public PersonelController(NorthwindContext northwindContext)\r\n        {\r\n            _northwindContext = northwindContext;\r\n        }\r\n        &#x5B;EnableQuery]\r\n        public IActionResult Get()\r\n        {\r\n            return Ok(_northwindContext.Personeller);\r\n        }\r\n    }\r\n<\/pre>\n<p>g\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere, ilgili controller s\u0131n\u0131f\u0131m\u0131z standart API yap\u0131lanmas\u0131ndaki gibi ne &#8216;ApiController&#8217; veya &#8216;Route&#8217; attributelar\u0131 taraf\u0131ndan i\u015faretlenmekte ne de &#8216;ControllerBase&#8217; s\u0131n\u0131f\u0131nda t\u00fcremektedir. Tabi burada ele almasakta uygulamaya entegre edilen protokol yap\u0131lanmas\u0131n\u0131n konfig\u00fcrasyonlar\u0131nda bu controller &#8216;ODataConventionModelBuilder&#8217; nesnesine &#8216;EntitySet&#8217; olarak tan\u0131mlanmakta ve Edm(Entity Data Model) olarak ilgili controller&#8217;\u0131n t\u00fcm y\u00f6netimi OData protokol\u00fcne devredilmektedir. <span style=\"font-size:10px;\">implemantasyon i\u00e7in gerekli konfig\u00fcrasyon temellerini ele ald\u0131\u011f\u0131m\u0131z <a href=\"https:\/\/www.gencayyildiz.com\/blog\/asp-net-core-web-api-uygulamasina-odata-implementasyonu\/\" rel=\"noopener noreferrer\" target=\"_blank\">Asp.NET Core Web API Uygulamas\u0131na OData Implementasyonu<\/a> ba\u015fl\u0131kl\u0131 makaleyi inceleyebilirsiniz.<\/span><\/p>\n<p>\u0130\u015fte bu devir neticesinde art\u0131k OData ilgili controller&#8217;da ki tan\u0131mlamalar\u0131 belirli bir standart \u00e7er\u00e7evesindeki varsay\u0131mlarla de\u011ferlendirmekte ve davran\u0131\u015f\u0131n\u0131 bu varsay\u0131mlara g\u00f6re g\u00f6stermektedir.<\/p>\n<p><strong>Nedir bu varsay\u0131mlar?<\/strong><br \/>\nURL \u00fczerinden yap\u0131lan sorgulamada bir &#8216;GET&#8217; iste\u011fi g\u00f6nderilecekse e\u011fer bu iste\u011fi kar\u015f\u0131layacak metot isminin ya &#8216;Get&#8217; ya da &#8216;Get{controller_name}&#8217; format\u0131nda olmas\u0131 gerekmektedir. Aksi taktirde iste\u011fi kar\u015f\u0131layacak farkl\u0131 isimde tan\u0131mlanm\u0131\u015f bir metot i\u015flevsellik g\u00f6stermeyecektir.<\/p>\n<p>Benzer \u015fekilde &#8216;id&#8217; bazl\u0131 sorgulamalar\u0131n yap\u0131laca\u011f\u0131 durumlarda ilgili &#8216;Get&#8217; metodunun a\u015fa\u011f\u0131daki gibi isimlendirilmi\u015f olmas\u0131 gerekmektedir.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n        &#x5B;EnableQuery]\r\n        public IActionResult Get(&#x5B;FromODataUri]int key)\r\n        {\r\n            return Ok(_northwindContext.Personeller.Where(p =&gt; p.PersonelId == key));\r\n        }\r\n<\/pre>\n<p>ya da<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n        &#x5B;EnableQuery]\r\n        public IActionResult GetPersonel(&#x5B;FromODataUri]int key)\r\n        {\r\n            return Ok(_northwindContext.Personeller.Where(p =&gt; p.PersonelId == key));\r\n        }\r\n<\/pre>\n<p>G\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere &#8216;id&#8217; de\u011ferini kar\u015f\u0131layacak olan parametre birebir &#8216;int key&#8217; \u015feklinde tan\u0131mlanmal\u0131 ve &#8216;FromODataUri&#8217; attribute&#8217;u ile i\u015faretlenmelidir. &#8216;int key&#8217; parametresi &#8216;int id&#8217; \u015feklinde tan\u0131mland\u0131\u011f\u0131nda bile ilgili metot hi\u00e7bir sorgulamada yine i\u015flevsellik g\u00f6stermeyecektir.<\/p>\n<p>Yukar\u0131daki gibi &#8216;id&#8217; bazl\u0131 sorgulama fonksiyonlar\u0131na istek g\u00f6nderebilmek i\u00e7in a\u015fa\u011f\u0131daki gibi url olu\u015fturulmas\u0131 yeterlidir.<\/p>\n<p>1 id de\u011ferine sahip olan personeli getirir.<br \/>\n<code style=\"color:red;\"><strong>https:\/\/localhost:5001\/odata\/<span style=\"color:blue;\">personel(1)<\/span><\/strong><\/code><\/p>\n<p>9 id de\u011ferine sahip olan personelin ad\u0131n\u0131, soyad\u0131n\u0131 ve yapt\u0131\u011f\u0131 t\u00fcm sat\u0131\u015flar\u0131n; sat\u0131\u015f id, sat\u0131\u015f tarihi ve adedini getirir.<br \/>\n<code style=\"color:red;\"><strong>https:\/\/localhost:5001\/odata\/<span style=\"color:blue;\">personel(9)?$select=adi, soyadi&$expand=satislar($select=satisid, satistarihi;$count=true)<\/span><\/strong><\/code><\/p>\n<h3>ODataRoute Attribute&#8217;u<\/h3>\n<p><strong>Peki bu varsay\u0131mlar\u0131 nas\u0131l \u00f6zelle\u015ftirebiliyoruz?<\/strong><br \/>\nMetot yahut parametre isimlerini \u00f6zelle\u015ftirebilmek i\u00e7in &#8216;ODataRoute&#8217; attribute&#8217;u kullan\u0131l\u0131r. \u015e\u00f6yle ki;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n        &#x5B;ODataRoute(&quot;personel&quot;)]\r\n        &#x5B;EnableQuery]\r\n        public IActionResult GetTumPersoneller()\r\n        {\r\n            return Ok(_northwindContext.Personeller);\r\n        }\r\n<\/pre>\n<p>ya da<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n        &#x5B;EnableQuery]\r\n        &#x5B;ODataRoute(&quot;personel({id})&quot;)]\r\n        public IActionResult GetIdyeGorePersonel(&#x5B;FromODataUri] int id)\r\n        {\r\n            return Ok(_northwindContext.Personeller.Where(p =&gt; p.PersonelId == id));\r\n        }\r\n<\/pre>\n<p>\u015feklinde kullan\u0131labilmektedir. Burada &#8216;ODataRoute&#8217; attribute&#8217;unda belirtilen &#8216;personel&#8217; de\u011ferinin birebir controller ismiyle ayn\u0131 oldu\u011funa ve &#8216;({id})&#8217; de\u011ferininde parametredekiyle isim olarak e\u015fle\u015fti\u011fine dikkatinizi \u00e7ekerim. Tabi burada bir hususa daha de\u011finmek istiyorum. O da bu metotlar\u0131n isimlerinin &#8216;Get&#8230;&#8217; ile ba\u015flama gereksinimidir. E\u011fer ki &#8216;Get&#8230;&#8217; \u00f6n ekiyle ba\u015flamazlarsa sorgulama neticesinde bu metotlar i\u015flevsellik g\u00f6stermeyeceklerdir.<\/p>\n<h3>ODataRoutePrefix Attribute&#8217;u<\/h3>\n<p>Custom isimlendirilmi\u015f action metotlar\u0131 &#8216;ODataRoute&#8217; attribute&#8217;u ile bildirirken daima controller ismini bildirmemiz gerekmektedir. Haliyle bu durum t\u00fcm actionlarda ger\u00e7ekle\u015fince a\u015fa\u011f\u0131daki gibi tekrar eden bir yap\u0131lanma kar\u015f\u0131m\u0131za \u00e7\u0131kacakt\u0131r.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public class PersonelController : ODataController\r\n    {\r\n        NorthwindContext _northwindContext;\r\n        .\r\n        .\r\n        .\r\n        &#x5B;ODataRoute(&quot;personel&quot;)]\r\n        &#x5B;EnableQuery]\r\n        public IActionResult GetTumPersoneller()\r\n        {\r\n            return Ok(_northwindContext.Personeller);\r\n        }\r\n\r\n        &#x5B;EnableQuery]\r\n        &#x5B;ODataRoute(&quot;personel({id})&quot;)]\r\n        public IActionResult GetIdyeGorePersonel(&#x5B;FromODataUri] int id)\r\n        {\r\n            return Ok(_northwindContext.Personeller.Where(p =&gt; p.PersonelId == id));\r\n        }\r\n    }\r\n<\/pre>\n<p>\u0130\u015fte bu tekrar\u0131 engellemek i\u00e7in controller seviyesinde &#8216;ODataRoutePrefix&#8217; attribute&#8217;unu kullanabilir ve t\u00fcm &#8216;ODataRoute&#8217; attribute&#8217;lar\u0131nda tekrar tekrar controller ismini yazmaktan kurtulunabilir.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    &#x5B;ODataRoutePrefix(&quot;personel&quot;)]\r\n    public class PersonelController : ODataController\r\n    {\r\n        NorthwindContext _northwindContext;\r\n        .\r\n        .\r\n        .\r\n        &#x5B;ODataRoute()]\r\n        &#x5B;EnableQuery]\r\n        public IActionResult GetTumPersoneller()\r\n        {\r\n            return Ok(_northwindContext.Personeller);\r\n        }\r\n\r\n        &#x5B;EnableQuery]\r\n        &#x5B;ODataRoute(&quot;({id})&quot;)]\r\n        public IActionResult GetIdyeGorePersonel(&#x5B;FromODataUri] int id)\r\n        {\r\n            return Ok(_northwindContext.Personeller.Where(p =&gt; p.PersonelId == id));\r\n        }\r\n    }\r\n<\/pre>\n<h3>OData Pagination<\/h3>\n<p>OData her ne kadar url \u00fczerinden sorgulama yapmam\u0131z\u0131 sa\u011flayarak API&#8217;lar\u0131m\u0131z\u0131n yeteneklerini artt\u0131r\u0131p biz developerlar\u0131n i\u015flerini kolayla\u015ft\u0131rsada, bu kolayl\u0131\u011f\u0131 g\u00f6lgede b\u0131rakacak ba\u015fka bir \u00f6zelli\u011fide b\u00fcnyesinde bar\u0131nd\u0131rmaktad\u0131r. Sayfalama&#8230; Bunun i\u00e7in action metotlar\u0131 i\u015faretledi\u011fimiz &#8216;EnableQuery&#8217; attribute&#8217;unun &#8216;PageSize&#8217; parametresine ne kadar veri gelmesi isteniyorsa belirtilmesi yeterlidir. \u015e\u00f6yle ki;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public class SatisController : ODataController\r\n    {\r\n        NorthwindContext _northwindContext;\r\n        public SatisController(NorthwindContext northwindContext)\r\n        {\r\n            _northwindContext = northwindContext;\r\n        }\r\n        &#x5B;EnableQuery(PageSize = 5)]\r\n        public IActionResult Get()\r\n        {\r\n            return Ok(_northwindContext.Satislar.ToList());\r\n        }\r\n    }\r\n<\/pre>\n<p>Bu API&#8217;ya a\u015fa\u011f\u0131daki gibi istek g\u00f6nderildi\u011finde i\u00e7erisinde bir sonraki sayfan\u0131n linkinide bar\u0131nd\u0131ran sonu\u00e7 d\u00f6nd\u00fcr\u00fclecektir.<br \/>\n<code style=\"color:red;\"><strong>https:\/\/localhost:5001\/odata\/<span style=\"color:blue;\">satis?$select=satisid,musteriid<\/span><\/strong><\/code><br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/05\/OData-Davran\u0131\u015f-Modellemesi-ve-Attributelar\u0131.gif\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/05\/OData-Davran\u0131\u015f-Modellemesi-ve-Attributelar\u0131.gif\" alt=\"OData Davran\u0131\u015f Modellemesi ve Attributelar\u0131\" width=\"800\" height=\"491\" class=\"aligncenter size-full wp-image-16020\" \/><\/a><\/p>\n<p>\u0130\u015fte g\u00f6r\u00fcld\u00fc\u011f\u00fc gibi, bu kadar basit&#8230; \ud83d\ude0e<\/p>\n<p>\u0130lgilenenlerin faydalanmas\u0131 dile\u011fiyle&#8230;<br \/>\nSonraki yaz\u0131lar\u0131mda g\u00f6r\u00fc\u015fmek \u00fczere&#8230;<br \/>\n\u0130yi \u00e7al\u0131\u015fmalar&#8230;<\/p>\n<!-- AddThis Advanced Settings generic via filter on the_content --><!-- AddThis Share Buttons generic via filter on the_content -->","protected":false},"excerpt":{"rendered":"<p>Merhaba, OData protokol\u00fcne dair \u00f6nceden kaleme alm\u0131\u015f oldu\u011fumuz makalelerimizden g\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere, OData; controllerlar\u0131n y\u00f6netimini ele almakta ve belirli varsay\u0131lan standartlar \u00fczerine yap\u0131lanmay\u0131 in\u015fa etmektedir. \u0130\u015fte bu i\u00e7eri\u011fimizde OData&#8217;n\u0131n varsay\u0131msal standartlar\u0131n\u0131 inceleyecek ve bir nebze&#46;&#46;&#46;<!-- AddThis Advanced Settings generic via filter on get_the_excerpt --><!-- AddThis Share Buttons generic via filter on get_the_excerpt --><\/p>\n","protected":false},"author":1,"featured_media":15889,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3516],"tags":[3529,3530,3526,3528,3527],"class_list":["post-15992","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-odata","tag-odata-attributes","tag-odata-davranisi","tag-odata-pagination","tag-odataroute","tag-odatarouteprefix"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/15992","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/comments?post=15992"}],"version-history":[{"count":30,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/15992\/revisions"}],"predecessor-version":[{"id":16023,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/15992\/revisions\/16023"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media\/15889"}],"wp:attachment":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media?parent=15992"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=15992"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=15992"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}