﻿
{"id":19915,"date":"2020-12-14T13:43:02","date_gmt":"2020-12-14T13:43:02","guid":{"rendered":"https:\/\/www.gencayyildiz.com\/blog\/?p=19915"},"modified":"2020-12-14T13:43:02","modified_gmt":"2020-12-14T13:43:02","slug":"entity-framework-core-global-query-filters","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/entity-framework-core-global-query-filters\/","title":{"rendered":"Entity Framework Core &#8211; Global Query Filters"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p>Merhaba,<\/p>\n<p>Entity Framework Core ile \u015fartl\u0131 sorgu deyince akla direkt <code style=\"color:red;font-size:12px;\">Where<\/code> komutu gelmektedir. Where, yap\u0131sal olarak bool mant\u0131kta ald\u0131\u011f\u0131 \u015fart ifadesini sorgu diline \u00e7evirmekte ve hedef verileri bizlere getirmekte olan bir LINQ sorgusudur. Lakin Where fonksiyonu d\u0131\u015f\u0131nda generate edilecek sql sorgusunu \u015fartl\u0131 olu\u015fturabilecek bir\u00e7ok LINQ sorgusu mevcuttur : <code style=\"color:red;font-size:12px;\">FirstOrDefault<\/code>, <code style=\"color:red;font-size:12px;\">Single<\/code> vs. Bu i\u00e7eri\u011fimizde t\u00fcm \u015fartl\u0131 sorgular\u0131 generate edebilen LINQ sorgular\u0131n\u0131n belirli bir entity&#8217;e \u00f6zel, uygulama seviyesinde genel\/global sorgu filtrelerinin olu\u015fturulmas\u0131n\u0131 sa\u011flayan <em>Global Query Filters<\/em> \u00f6zelli\u011fi inceliyor olaca\u011f\u0131z.<\/p>\n<p>Global Query Filters, bir entity&#8217;e \u00f6zel uygulama seviyesinde genel\/\u00f6n kabull\u00fc \u015fart olu\u015fturmam\u0131z\u0131 ve b\u00f6ylece verileri global bir \u015fekilde filtrelememizi sa\u011flayan \u00f6zelliktir. Belirtilen entity \u00fczerinde yap\u0131lan t\u00fcm sorgulamalarda ekstradan bir \u015fart ifadesine gerek kalmaks\u0131z\u0131n filtreleri otomatik uygulayarak, h\u0131zl\u0131ca sorgulama yapmam\u0131z\u0131 sa\u011flamaktad\u0131r.<\/p>\n<p>Misal olarak, sadece aktif olan personelleri elde etmek istedi\u011fimizde a\u015fa\u011f\u0131daki gibi bir sorgu olu\u015fturmam\u0131z gerekmektedir :<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nvar employees = context.Employees.Where(e =&gt; e.IsActive).ToList();\r\n<\/pre>\n<p>\u0130htiyaca binaen bu tarz bir sorgu olduk\u00e7a do\u011fald\u0131r. Amma velakin, her personel sorgulamas\u0131nda sadece aktif olanlar\u0131n elde edilmesi gerekiyorsa bu durum kod maliyeti a\u00e7\u0131s\u0131ndan zarara yol a\u00e7acakt\u0131r. Nihayetinde Employee entity&#8217;sine her sorgu olu\u015fturulan yerde <code style=\"font-size:12px;\">Where(e => e.IsActive)<\/code> komutunun kullan\u0131lmas\u0131, ba\u011flay\u0131c\u0131 ve s\u00f6n\u00fck bir kal\u0131ptan ibaret olacakt\u0131r. B\u00f6yle bir durumda Employee entity&#8217;sine global seviyede ilgili \u015fart\u0131 \u00f6n ko\u015fullu olarak tan\u0131mlamak en do\u011frusu olacakt\u0131r.<\/p>\n<p>Bunun i\u00e7in global query filters \u00f6zelli\u011fini kullanmam\u0131z gerekmektedir. \u0130lgili \u00f6zellik sayesinde, uygulama seviyesinde Employee t\u00fcr\u00fcne \u00f6zg\u00fc bir \u00f6n tan\u0131ml\u0131 \u015fart ekleyece\u011fiz. Bu eklenen \u015fart LINQ sorgusu \u00e7al\u0131\u015ft\u0131r\u0131lmadan \u00f6nce ilgili sorguya filtre olarak otomatik eklenecektir. Global query filters&#8217;\u0131 ekleyebilmek i\u00e7in genellikle &#8216;OnModelCreating&#8217; metodu kullan\u0131labilmektedir;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n        protected override void OnModelCreating(ModelBuilder modelBuilder)\r\n        {\r\n            modelBuilder.Entity&lt;Employee&gt;().HasQueryFilter(e =&gt; e.IsActive);\r\n            base.OnModelCreating(modelBuilder);\r\n        }\r\n<\/pre>\n<p>G\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere Employee entity&#8217;sine global query filter &#8216;HasQueryFilter&#8217; metodu sayesinde eklenmi\u015ftir. Bu konfig\u00fcrasyondan sonra ilgili uygulamada Employee \u00fczerine yap\u0131lan t\u00fcm sorgular default olarak bu \u015farta tabi tutulacakt\u0131r.<\/p>\n<p>\u0130lgili sorguyu \u015fart\u0131 eklemeksizin a\u015fa\u011f\u0131daki gibi \u00e7al\u0131\u015ft\u0131rd\u0131\u011f\u0131m\u0131zda da yukar\u0131daki ile ayn\u0131 sonucu verecektir.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nvar employees = context.Employees.ToList();\r\n<\/pre>\n<div id=\"attachment_19926\" style=\"width: 315px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/12\/Entity-Framework-Core-Global-Query-Filters.png\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-19926\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/12\/Entity-Framework-Core-Global-Query-Filters.png\" alt=\"Entity Framework Core - Global Query Filters\" width=\"305\" height=\"44\" class=\"size-full wp-image-19926\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/12\/Entity-Framework-Core-Global-Query-Filters.png 305w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/12\/Entity-Framework-Core-Global-Query-Filters-300x43.png 300w\" sizes=\"auto, (max-width: 305px) 100vw, 305px\" \/><\/a><p id=\"caption-attachment-19926\" class=\"wp-caption-text\">Global query filters \u00f6zelli\u011fi uygulanan entity&#8217;de yap\u0131lan i\u015flem neticesinde generate edilen sorgu&#8230;<\/p><\/div>\n<p>Bu \u00f6zellik kullan\u0131l\u0131rken dikkat edilmesi gereken bir husus vard\u0131r ki, o da, global query filters \u00fczerine tekrar sorgu \u00e7ekmektir.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nvar employees = context.Employees.Where(e =&gt; e.IsActive).ToList();\r\n<\/pre>\n<p>Zaten var olan filters \u00fczerine \u00e7ekilen sorgu &#8220;ve&#8221; mant\u0131\u011f\u0131nda de\u011ferlendirilecek ve generate edilen sql sorgusuna dahil edilecektir.<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/12\/Entity-Framework-Core-Global-Query-Filters-1.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/12\/Entity-Framework-Core-Global-Query-Filters-1.png\" alt=\"Entity Framework Core - Global Query Filters\" width=\"544\" height=\"41\" class=\"aligncenter size-full wp-image-19928\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/12\/Entity-Framework-Core-Global-Query-Filters-1.png 544w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/12\/Entity-Framework-Core-Global-Query-Filters-1-300x23.png 300w\" sizes=\"auto, (max-width: 544px) 100vw, 544px\" \/><\/a>Bu durumda sorgu l\u00fczumsuz yere \u015fartlara bo\u011fulmakta ve maliyeti artmaktad\u0131r. O y\u00fczden ilgili \u00f6zelli\u011fin kullan\u0131ld\u0131\u011f\u0131 entity&#8217;ler de istemsizce bu duruma d\u00fc\u015fmemek i\u00e7in dikkatli olmakta fayda vard\u0131r.<\/p>\n<p><strong>IgnoreQueryFilters Metodu<\/strong><br \/>\nBaz\u0131 durumlarda global olarak tan\u0131mlanm\u0131\u015f bu filtrenin uygulanmas\u0131na ihtiyac\u0131m\u0131z olmayacakt\u0131r. B\u00f6yle bir durumda olu\u015fturulacak LINQ sorgusuna \u00f6zel &#8216;IgnoreQueryFilters&#8217; metoduyla ilgili filtreyi devre d\u0131\u015f\u0131 b\u0131rakabiliriz.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nvar employees = context.Employees.IgnoreQueryFilters().ToList();\r\n<\/pre>\n<p>B\u00f6ylece filtre uygulamaks\u0131z\u0131n t\u00fcm veriler elde edilecektir. Ya da farkl\u0131 \u015fartlarla sorguyu s\u0131f\u0131rdan in\u015fa edebilirsiniz&#8230;<\/p>\n<p>Nihai olarak;<br \/>\nGlobal Query Filters \u00f6zelli\u011finin, bir sorgunun birden fazla ayn\u0131 \u00f6zelli\u011fi g\u00f6sterdi\u011fi ve ayn\u0131 \u015fartlar\u0131 uygulad\u0131\u011f\u0131 durumlarda bir ba\u015fka deyi\u015fle multitenancy senaryolarda tercih edildi\u011fini g\u00f6zlemlemekteyiz. \u0130htiyaca binaen kullan\u0131ld\u0131\u011f\u0131nda kod a\u00e7\u0131s\u0131ndan temiz ve sade bir sorgulama yetisi kazand\u0131rd\u0131\u011f\u0131 kanaatindeyiz.<\/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, Entity Framework Core ile \u015fartl\u0131 sorgu deyince akla direkt Where komutu gelmektedir. Where, yap\u0131sal olarak bool mant\u0131kta ald\u0131\u011f\u0131 \u015fart ifadesini sorgu diline \u00e7evirmekte ve hedef verileri bizlere getirmekte olan bir LINQ sorgusudur. Lakin&#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":11538,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2914],"tags":[2850,4007,4006,4008,4009],"class_list":["post-19915","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-entity-framework-core","tag-entity-framework-core","tag-entity-framework-core-global-query-filters","tag-global-query-filters","tag-hasqueryfilter","tag-ignorequeryfilters"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/19915","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=19915"}],"version-history":[{"count":18,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/19915\/revisions"}],"predecessor-version":[{"id":19935,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/19915\/revisions\/19935"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media\/11538"}],"wp:attachment":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media?parent=19915"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=19915"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=19915"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}