<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Mustafa  Çam</title>
    <description>The latest articles on DEV Community by Mustafa  Çam (@mustafacam).</description>
    <link>https://dev.to/mustafacam</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1084527%2Faf054c2d-7a0e-41f3-9a57-4a34ee916728.png</url>
      <title>DEV Community: Mustafa  Çam</title>
      <link>https://dev.to/mustafacam</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/mustafacam"/>
    <language>en</language>
    <item>
      <title>useRef</title>
      <dc:creator>Mustafa  Çam</dc:creator>
      <pubDate>Sat, 03 May 2025 20:40:52 +0000</pubDate>
      <link>https://dev.to/mustafacam/useref-2b8k</link>
      <guid>https://dev.to/mustafacam/useref-2b8k</guid>
      <description>&lt;p&gt;Şimdi daha detaylı bir şekilde, bir benzetme ile açıklayalım.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;useRef&lt;/code&gt; Ne İşe Yarar?
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;useRef&lt;/code&gt;, &lt;strong&gt;komponentin yeniden render edilmesini tetiklemeyen&lt;/strong&gt; bir "değer tutucu" sağlar. Bu, bir değeri "saklamak" anlamına gelir, ama bu değer değiştiğinde UI yeniden render edilmez. Genellikle &lt;strong&gt;DOM referanslarına&lt;/strong&gt; erişmek veya bir değişkeni render döngüsüne etki etmeden saklamak için kullanılır.&lt;/p&gt;




&lt;h3&gt;
  
  
  Benzetme:
&lt;/h3&gt;

&lt;p&gt;Bir okul sınıfı düşün. Bu sınıfta öğretmen (React komponenti) var. Öğretmenin tahtada yazdığı her şey (UI) çok önemli, çünkü öğrenciler (kullanıcılar) bunu görerek öğreniyorlar.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;useState&lt;/code&gt;&lt;/strong&gt; öğretmenin tahta üzerine yazdığı yazıları ifade eder. Öğretmen her yazıyı değiştirdiğinde, öğrenciler buna bakacak ve öğrencilerin sınıfta başka işlere başlaması için tahta (UI) yeniden yazılacaktır.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;useRef&lt;/code&gt;&lt;/strong&gt; ise öğretmenin cebinde taşıdığı notlar gibi düşünülebilir. Bu notlar, öğrencilerin görmediği, ancak öğretmenin cebinde tuttuğu verilerdir. Eğer öğretmen bu notları değiştirirse, öğrenciler bunu görmez çünkü tahtada bir değişiklik olmayacaktır. Öğretmen sadece notları kullanarak dersini ilerletir ama bu, sınıftaki genel görünümü (UI) etkilemez.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  &lt;code&gt;useRef&lt;/code&gt; Kullanım Durumları:
&lt;/h3&gt;

&lt;h4&gt;
  
  
  1. &lt;strong&gt;DOM Erişimi:&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;&lt;code&gt;useRef&lt;/code&gt;, genellikle DOM elemanlarına erişmek için kullanılır. Bir input elemanına odaklanmak, bir düğmeye tıklamak gibi işlemleri yapabilirsiniz. Bu tür işlemler, UI'ı değiştirmez; sadece arka planda gerçekleşir.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Örnek:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;inputRef&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useRef&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;handleFocus&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;inputRef&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;current&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;focus&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// Bu, input'a odaklanır ancak komponent yeniden render edilmez.&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;input&lt;/span&gt; &lt;span class="nx"&gt;ref&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;inputRef&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;button&lt;/span&gt; &lt;span class="nx"&gt;onClick&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;handleFocus&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Odaklan&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/button&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  2. &lt;strong&gt;Değerleri Saklamak (Render'ı Etkilemeden):&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;Bazen bir değeri saklamak istersiniz, ancak bu değerin değişmesi UI'ın yeniden render edilmesine yol açmamalıdır. Örneğin, bir zamanlayıcıyı takip etmek veya önceki bir değeri saklamak gibi.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Örnek:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useRef&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;increment&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;current&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;current&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Bu, sayacın değerini tutar ama UI'ı değiştirmez.&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;button&lt;/span&gt; &lt;span class="nx"&gt;onClick&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;increment&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Arttır&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/button&amp;gt;&lt;/span&gt;&lt;span class="err"&gt;;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Burada, &lt;code&gt;count.current&lt;/code&gt; değişse de komponent yeniden render edilmez. Bu sayede, eski değerleri veya hesaplamaları tutabilirsiniz.&lt;/p&gt;




&lt;h3&gt;
  
  
  Temel Fark:
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;useState&lt;/code&gt;, UI'ı değiştirecek bir veri saklamak içindir ve bu verinin değişmesi her zaman render tetikler. &lt;code&gt;useRef&lt;/code&gt; ise sadece veriyi tutmak için kullanılır ve bu verinin değişmesi UI'ın yeniden render edilmesine yol açmaz.&lt;/p&gt;

&lt;p&gt;Özetle:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;useState&lt;/code&gt;&lt;/strong&gt;: UI'ı değiştiren değerler için.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;useRef&lt;/code&gt;&lt;/strong&gt;: Render'ı etkilemeden, sadece veri tutmak ya da DOM'a erişmek için.&lt;/li&gt;
&lt;/ul&gt;

</description>
    </item>
    <item>
      <title>langchain nedir ?</title>
      <dc:creator>Mustafa  Çam</dc:creator>
      <pubDate>Sat, 12 Apr 2025 18:30:56 +0000</pubDate>
      <link>https://dev.to/mustafacam/langchain-nedir--5b3o</link>
      <guid>https://dev.to/mustafacam/langchain-nedir--5b3o</guid>
      <description>&lt;p&gt;LangChain, özellikle &lt;strong&gt;LLM'leri (Large Language Model / Büyük Dil Modelleri)&lt;/strong&gt; daha güçlü ve işlevsel hale getirmek için geliştirilmiş bir Python (ve sonradan JavaScript) kütüphanesidir. LLM’leri &lt;strong&gt;veri kaynaklarıyla, araçlarla ve kullanıcı girdileriyle&lt;/strong&gt; dinamik olarak birleştirerek daha gelişmiş uygulamalar oluşturmanı sağlar.&lt;/p&gt;

&lt;h3&gt;
  
  
  Basitçe söylemek gerekirse:
&lt;/h3&gt;

&lt;p&gt;LangChain, ChatGPT gibi modellerin:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Gerçek verilerle konuşmasını&lt;/strong&gt;,
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Veritabanı sorgulaması yapmasını&lt;/strong&gt;,
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Web'den bilgi almasını&lt;/strong&gt;,
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Karmaşık iş akışlarını (pipeline) yönetmesini&lt;/strong&gt;
sağlayan bir altyapı sunar.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  LangChain ile neler yapılabilir?
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Veriye dayalı sohbet botları&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Örneğin: "PDF dosyalarımla konuş", "Veritabanına bağlan ve bana rapor ver", "Web siteni analiz et".&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Araç kullanan yapay zekâlar (Agent)&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Mesela: Google'da arama yap, hesap makinesi kullan, takvim oluştur vb.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Chain (zincir) yapıları kurma&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Çok adımlı LLM süreçleri:&lt;br&gt;&lt;br&gt;
Örneğin: Özet çıkar → Özetten soru üret → Cevapları analiz et&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Bellekli sistemler (Memory)&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
ChatGPT gibi geçmiş mesajları hatırlayan sistemler geliştirebilirsin.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;h3&gt;
  
  
  LangChain'in bazı önemli bileşenleri:
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Bileşen&lt;/th&gt;
&lt;th&gt;Açıklama&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;PromptTemplate&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;LLM'e ne sorulacağını şablonlaştırır&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;LLM&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;OpenAI, HuggingFace, Cohere gibi modellerle çalışır&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Chains&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Birden fazla adımı birbirine bağlar&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Agents&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Duruma göre hangi aracı kullanacağını seçen yapılar&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Memory&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Önceki sohbetleri hatırlama&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Tools&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Arama motoru, hesap makinesi gibi dış araçlar&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Retrievers / Vector Stores&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Belge arama için kullanılır (örneğin: FAISS, Pinecone)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h3&gt;
  
  
  Örnek bir senaryo:
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;“Bir PDF dökümanı yükle, içeriğini özetle, ardından kullanıcıdan gelen sorulara o özete göre cevap ver.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Bu senaryo için LangChain:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;PDF'den veri okur&lt;/li&gt;
&lt;li&gt;Verileri vektör haline getirir (embedding)&lt;/li&gt;
&lt;li&gt;ChatGPT’ye soruları iletirken bu verileri bağlar&lt;/li&gt;
&lt;li&gt;Sonuçları kullanıcıya sunar&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>llm</category>
      <category>ai</category>
    </item>
    <item>
      <title>ef core select</title>
      <dc:creator>Mustafa  Çam</dc:creator>
      <pubDate>Tue, 08 Apr 2025 11:07:32 +0000</pubDate>
      <link>https://dev.to/mustafacam/ef-core-select-6h9</link>
      <guid>https://dev.to/mustafacam/ef-core-select-6h9</guid>
      <description>&lt;p&gt;Entity Framework Core (EF Core) ile &lt;strong&gt;&lt;code&gt;Select&lt;/code&gt;&lt;/strong&gt;, veritabanındaki verileri sorgulamak ve yalnızca belirli alanları veya verileri almak için kullanılan bir LINQ (Language Integrated Query) metodudur. &lt;code&gt;Select&lt;/code&gt; metodu, genellikle bir veri kümesinin her elemanını dönüştürmek veya sadece belirli özellikleri almak amacıyla kullanılır.&lt;/p&gt;

&lt;h3&gt;
  
  
  Temel Kullanım:
&lt;/h3&gt;

&lt;p&gt;EF Core ile &lt;code&gt;Select&lt;/code&gt; kullanarak sorgulama yaparken genellikle şu iki ana amaca yöneliriz:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Veri Seçimi&lt;/strong&gt;: Sadece bazı alanları (sütunları) almak.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Veri Dönüştürme&lt;/strong&gt;: Veriyi daha farklı bir türde almak (örneğin, bir DTO - Data Transfer Object).&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  1. Sadece Belirli Alanları Seçmek
&lt;/h3&gt;

&lt;p&gt;Aşağıdaki örnekte, &lt;code&gt;User&lt;/code&gt; tablosundaki yalnızca &lt;code&gt;Name&lt;/code&gt; ve &lt;code&gt;Email&lt;/code&gt; alanlarını seçiyoruz:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;dbContext&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Users&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Select&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;u&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;u&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;u&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Email&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ToList&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bu sorgu, her bir &lt;code&gt;User&lt;/code&gt; nesnesinin &lt;code&gt;Name&lt;/code&gt; ve &lt;code&gt;Email&lt;/code&gt; özelliklerini alır. Bu, veritabanı sorgusunda gereksiz verilerin çekilmesini engeller ve daha verimli bir sorgu yapılmasını sağlar.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Veriyi Dönüştürmek (DTO Kullanımı)
&lt;/h3&gt;

&lt;p&gt;Veritabanı verilerini genellikle bir DTO sınıfına dönüştürmek de yaygın bir kullanım şeklidir. Aşağıda, &lt;code&gt;User&lt;/code&gt; nesnelerini bir &lt;code&gt;UserDto&lt;/code&gt;'ya dönüştürme örneği bulunmaktadır:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;UserDto&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;Name&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;Email&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;dbContext&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Users&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Select&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;u&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;UserDto&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;Name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;u&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Email&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;u&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Email&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ToList&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bu sorguda, &lt;code&gt;User&lt;/code&gt; nesneleri &lt;code&gt;UserDto&lt;/code&gt; nesnelerine dönüştürülüyor.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. &lt;code&gt;Select&lt;/code&gt; ile İlişkili Verileri Seçmek
&lt;/h3&gt;

&lt;p&gt;EF Core'da ilişkili verileri de &lt;code&gt;Select&lt;/code&gt; kullanarak sorgulamak mümkündür. Örneğin, bir &lt;code&gt;Order&lt;/code&gt; tablosunda her bir siparişin &lt;code&gt;Customer&lt;/code&gt; bilgilerini almak:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;orders&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;dbContext&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Orders&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Select&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; 
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;OrderId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;CustomerName&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Customer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Name&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ToList&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Burada, her siparişin &lt;code&gt;OrderId&lt;/code&gt; ve ona bağlı olan &lt;code&gt;Customer&lt;/code&gt;'ın &lt;code&gt;Name&lt;/code&gt; özelliği seçilmektedir.&lt;/p&gt;

&lt;h3&gt;
  
  
  Özet
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;Select&lt;/code&gt; metodu, EF Core'da veritabanından sadece gerekli verilerin alınmasını sağlamak ve performansı artırmak için yaygın olarak kullanılır. Aynı zamanda, verileri daha anlamlı hale getirmek için dönüştürme işlemleri (DTO, anonim tipler vb.) de yapılabilir.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>dotnet</category>
    </item>
    <item>
      <title>Navigation Property neden var ? Amacımız ne ?</title>
      <dc:creator>Mustafa  Çam</dc:creator>
      <pubDate>Thu, 03 Apr 2025 12:53:39 +0000</pubDate>
      <link>https://dev.to/mustafacam/navigation-property-neden-var-amacimiz-ne--3aoc</link>
      <guid>https://dev.to/mustafacam/navigation-property-neden-var-amacimiz-ne--3aoc</guid>
      <description>&lt;p&gt;AI ile oluşturuldu.&lt;/p&gt;

&lt;p&gt;Çok güzel bir noktaya değindin! &lt;strong&gt;Entity Framework Core'da (EF Core) navigation property'lerin veritabanında doğrudan karşılığı olmaz.&lt;/strong&gt; Şimdi neden böyle olduğunu detaylı açıklayayım.  &lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;1. Navigation Property Nedir?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Navigation property (&lt;code&gt;User&lt;/code&gt; ve &lt;code&gt;Words&lt;/code&gt; gibi) &lt;strong&gt;veritabanında doğrudan bir sütun olarak saklanmaz&lt;/strong&gt;, sadece &lt;strong&gt;EF Core'un ilişkileri anlamasını ve kolayca sorgu yapabilmesini&lt;/strong&gt; sağlar.  &lt;/p&gt;

&lt;p&gt;Yani şu &lt;strong&gt;Word entity'sindeki &lt;code&gt;User&lt;/code&gt; property&lt;/strong&gt; &lt;strong&gt;veritabanında yer almaz&lt;/strong&gt;, ama EF Core onun sayesinde ilişkileri otomatik yönetir:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Word&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;BaseEntity&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;WordText&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;UserId&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="c1"&gt;// FOREIGN KEY (Bu veritabanında vardır)&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;User&lt;/span&gt; &lt;span class="n"&gt;User&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="c1"&gt;// NAVIGATION PROPERTY (Bu veritabanında YOKTUR)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;UserId&lt;/code&gt; → &lt;strong&gt;Foreign Key olarak veritabanında bir sütun olarak bulunur.&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;User&lt;/code&gt; → &lt;strong&gt;Sadece EF Core'un ilişkileri takip etmesini sağlayan bir referanstır, veritabanında karşılığı yoktur.&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;2. Peki Navigation Property'nin Faydası Nedir?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Navigation property, &lt;strong&gt;veritabanı sorgularını yazmayı kolaylaştırır&lt;/strong&gt;. Mesela aşağıdaki gibi bir &lt;strong&gt;User'ın kelimelerini çekmek için&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;userWords&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;_context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Users&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;u&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;u&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Id&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="n"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Include&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;u&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;u&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Words&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// Navigation Property ile ilgili verileri getiriyoruz&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;FirstOrDefault&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;EF Core, bu sorguyu &lt;strong&gt;arka planda JOIN'li bir SQL sorgusuna çevirir&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;Words&lt;/span&gt; &lt;span class="n"&gt;w&lt;/span&gt;
&lt;span class="k"&gt;JOIN&lt;/span&gt; &lt;span class="n"&gt;Users&lt;/span&gt; &lt;span class="n"&gt;u&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;UserId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;u&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Id&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;u&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Yani navigation property sayesinde &lt;strong&gt;LINQ ile yazılan sorgular otomatik olarak doğru JOIN işlemleri ile çevrilir.&lt;/strong&gt;  &lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;3. Navigation Property Olmasaydı Ne Olurdu?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Eğer &lt;code&gt;User&lt;/code&gt; navigation property’sini eklemezsen, &lt;strong&gt;ilişkiyi manuel olarak kurman gerekir&lt;/strong&gt;. Örneğin:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;userWords&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;_context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Words&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;w&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;UserId&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="n"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ToList&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Burada doğrudan &lt;code&gt;User&lt;/code&gt; objesi olmadan çalışırsın. Ama &lt;strong&gt;Include ile ilişkili verileri çekemezsin&lt;/strong&gt;, &lt;strong&gt;manuel JOIN yapman gerekebilir&lt;/strong&gt; ve &lt;strong&gt;kod okunurluğu azalır&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;4. Özet&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Navigation Property (&lt;code&gt;User&lt;/code&gt; gibi)&lt;/strong&gt; → &lt;strong&gt;EF Core içinde kullanılır, veritabanında karşılığı yoktur.&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Foreign Key (&lt;code&gt;UserId&lt;/code&gt;)&lt;/strong&gt; → &lt;strong&gt;Veritabanında bir sütun olarak bulunur ve ilişkileri tanımlar.&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;EF Core, Navigation Property'leri kullanarak JOIN'leri otomatik yönetir.&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Eğer navigation property olmasa, LINQ ile ilişkili veri çekmek daha zor olurdu.&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bu yüzden EF Core &lt;strong&gt;navigation property’leri sadece kod seviyesinde kullanır&lt;/strong&gt;, ama &lt;strong&gt;ilişkiyi kurmak için Foreign Key’i (UserId) veritabanında tutar&lt;/strong&gt;.  &lt;/p&gt;

&lt;p&gt;Anlaşılır oldu mu? Takıldığın bir nokta varsa açıklayabilirim! 🚀😎&lt;/p&gt;

</description>
      <category>csharp</category>
      <category>dotnetcore</category>
      <category>programming</category>
    </item>
    <item>
      <title>Why is the foreign key in many table in one-to-many relationship</title>
      <dc:creator>Mustafa  Çam</dc:creator>
      <pubDate>Thu, 13 Mar 2025 06:41:01 +0000</pubDate>
      <link>https://dev.to/mustafacam/why-is-the-foreign-key-in-many-table-in-one-to-many-relationship-3og7</link>
      <guid>https://dev.to/mustafacam/why-is-the-foreign-key-in-many-table-in-one-to-many-relationship-3og7</guid>
      <description>&lt;p&gt;&lt;strong&gt;Foreign Key (FK) "bire" tarafındaki tabloda bulunsaydı&lt;/strong&gt;, şu problemlerle karşılaşırdık:  &lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;1. Çok Sayıda Kolon (Boş Alan) Olurdu&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Her "bire" (Class) kaydı, kendisiyle ilişkili &lt;strong&gt;birden fazla&lt;/strong&gt; "çok" (Student) kaydını referans almak zorunda kalırdı.  &lt;/p&gt;

&lt;p&gt;Örneğin, &lt;strong&gt;"Class" tablosuna öğrencileri eklemeye çalışsaydık&lt;/strong&gt;:  &lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Id&lt;/th&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Student1&lt;/th&gt;
&lt;th&gt;Student2&lt;/th&gt;
&lt;th&gt;Student3&lt;/th&gt;
&lt;th&gt;Student4&lt;/th&gt;
&lt;th&gt;...&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;10A&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;NULL&lt;/td&gt;
&lt;td&gt;NULL&lt;/td&gt;
&lt;td&gt;...&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;10B&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;NULL&lt;/td&gt;
&lt;td&gt;NULL&lt;/td&gt;
&lt;td&gt;NULL&lt;/td&gt;
&lt;td&gt;...&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;Kaç öğrenci olacağını &lt;strong&gt;bilemeyeceğimiz&lt;/strong&gt; için kolon sayısı &lt;strong&gt;sabit olamazdı&lt;/strong&gt;.
&lt;/li&gt;
&lt;li&gt;Yeni bir öğrenci eklemek için &lt;strong&gt;Class tablosunun şemasını değiştirmemiz gerekirdi&lt;/strong&gt;.
&lt;/li&gt;
&lt;li&gt;NULL değerler içeren &lt;strong&gt;gereksiz kolonlar oluşurdu&lt;/strong&gt;.
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;2. Veritabanı Normalizasyonu Bozulurdu&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Veritabanı tasarımında &lt;strong&gt;1. normal form (1NF)&lt;/strong&gt; gereği, &lt;strong&gt;bir alan (kolon) sadece tek bir değeri içermelidir&lt;/strong&gt;.  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;FK, "bire" tarafında olursa, &lt;strong&gt;bir kolon birden fazla değeri tutamaz&lt;/strong&gt;.
&lt;/li&gt;
&lt;li&gt;Bu nedenle &lt;strong&gt;çok tarafındaki satırları bireye bağlamak zorundayız&lt;/strong&gt;.
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;3. Sorgular Karmaşıklaşır ve Performans Düşer&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Normalde &lt;strong&gt;ClassId üzerinden&lt;/strong&gt; öğrencilere ulaşmak &lt;strong&gt;hızlı&lt;/strong&gt; ve &lt;strong&gt;kolay&lt;/strong&gt; olur. Ancak:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;"Bire" tarafına FK koyarsak&lt;/strong&gt;, belirli bir öğrenciye hangi sınıfın ait olduğunu sorgulamak &lt;strong&gt;daha zor&lt;/strong&gt; olur.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;JOIN işlemleri&lt;/strong&gt; daha karmaşık hale gelir ve performans kaybı yaşanır.
&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;Sonuç:&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Foreign Key (FK), "çok" tarafında olmalıdır!&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
📌 &lt;strong&gt;Çünkü:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
✅ "Bire" tarafında FK olursa &lt;strong&gt;tasarım bozulur&lt;/strong&gt;, &lt;strong&gt;gereksiz kolonlar oluşur&lt;/strong&gt;, &lt;strong&gt;veri tekrarı olur&lt;/strong&gt; ve &lt;strong&gt;performans düşer&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;
✅ "Çok" tarafında FK olursa &lt;strong&gt;her kayıt yalnızca 1 FK tutar&lt;/strong&gt;, &lt;strong&gt;esnek olur&lt;/strong&gt; ve &lt;strong&gt;sorgular hızlı çalışır&lt;/strong&gt;.  &lt;/p&gt;

&lt;p&gt;Eğer &lt;strong&gt;tersini uygulayan bir veritabanı&lt;/strong&gt; ile karşılaşırsan, &lt;strong&gt;yanlış bir tasarım olabilir&lt;/strong&gt; ve düzeltilmesi gerekebilir. 😃&lt;/p&gt;

</description>
    </item>
    <item>
      <title>DIP'i İhlal Eden Durum</title>
      <dc:creator>Mustafa  Çam</dc:creator>
      <pubDate>Wed, 05 Mar 2025 14:33:09 +0000</pubDate>
      <link>https://dev.to/mustafacam/diyi-ihlal-eden-durum-3i0b</link>
      <guid>https://dev.to/mustafacam/diyi-ihlal-eden-durum-3i0b</guid>
      <description>&lt;h3&gt;
  
  
  Senaryo: E-posta Gönderme İşlemi
&lt;/h3&gt;

&lt;p&gt;Bir &lt;code&gt;EmailService&lt;/code&gt; sınıfımız olsun ve bu sınıf doğrudan bir &lt;strong&gt;somut sınıf&lt;/strong&gt; olan &lt;code&gt;SmtpClient&lt;/code&gt;'a bağımlı olsun. Bu durumda, &lt;code&gt;SmtpClient&lt;/code&gt;'ı değiştirmek ya da farklı bir e-posta gönderme servisi eklemek istediğimizde, &lt;code&gt;EmailService&lt;/code&gt; sınıfında değişiklik yapmak zorunda kalırız.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. &lt;strong&gt;DIP'yi İhlal Eden Durum (Sıkı Bağlantı)&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;EmailService&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="n"&gt;SmtpClient&lt;/span&gt; &lt;span class="n"&gt;_smtpClient&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;EmailService&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;_smtpClient&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;SmtpClient&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;  &lt;span class="c1"&gt;// Direkt olarak SmtpClient'a bağlı.&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;SendEmail&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;subject&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;_smtpClient&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;subject&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;SmtpClient&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;subject&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;$"E-posta gönderildi: &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt;, &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;subject&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt;, &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;Sıkı Bağlantı Sorunu:&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Şu anki yapımızda, &lt;code&gt;EmailService&lt;/code&gt; sınıfı &lt;strong&gt;doğrudan&lt;/strong&gt; &lt;code&gt;SmtpClient&lt;/code&gt; sınıfına bağlıdır. Bu durumda, &lt;code&gt;EmailService&lt;/code&gt;'in işlevselliğini değiştirmek istesek (örneğin, e-posta gönderme yöntemini değiştirmek veya başka bir e-posta servisi kullanmak gibi), &lt;code&gt;EmailService&lt;/code&gt; sınıfında mutlaka değişiklik yapmamız gerekir.&lt;/p&gt;

&lt;p&gt;Diyelim ki, yeni bir &lt;strong&gt;SendGridEmailClient&lt;/strong&gt; eklemek istiyoruz ve &lt;code&gt;EmailService&lt;/code&gt;'in &lt;code&gt;SmtpClient&lt;/code&gt;'a olan bağımlılığını değiştirmemiz gerekiyor.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. &lt;strong&gt;Değişiklik Yapma Zorunluluğu (Bağımlılıklar Sıkıdır)&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Eğer &lt;code&gt;EmailService&lt;/code&gt; doğrudan &lt;code&gt;SmtpClient&lt;/code&gt;'a bağlıysa ve biz &lt;strong&gt;SendGrid&lt;/strong&gt; kullanmaya karar verirsek, o zaman &lt;code&gt;EmailService&lt;/code&gt; sınıfını değiştirmemiz gerekecek.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;SendGridEmailClient&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;subject&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;$"E-posta gönderildi (SendGrid): &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt;, &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;subject&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt;, &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;EmailService&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="n"&gt;SendGridEmailClient&lt;/span&gt; &lt;span class="n"&gt;_sendGridEmailClient&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;EmailService&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;_sendGridEmailClient&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;SendGridEmailClient&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;  &lt;span class="c1"&gt;// SendGrid'e geçiş yapıyoruz.&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;SendEmail&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;subject&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;_sendGridEmailClient&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;subject&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Değişiklikler:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;EmailService&lt;/code&gt;'i değiştirmek zorunda kaldık çünkü &lt;code&gt;SmtpClient&lt;/code&gt;'a olan bağımlılığı doğrudan yerleştirmiştik.&lt;/li&gt;
&lt;li&gt;Ayrıca &lt;code&gt;EmailService&lt;/code&gt;'i test etmek ya da başka bir servise entegre etmek için bu tür bağımlılıkları değiştirmeniz gerekecek.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. &lt;strong&gt;DIP'yi Uygulayan Durum (Esnek ve Soyutlamalı)&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Eğer DIP'yi uygularsak, &lt;code&gt;EmailService&lt;/code&gt; sadece bir &lt;strong&gt;soyutlama&lt;/strong&gt; olan &lt;code&gt;IEmailClient&lt;/code&gt;'e bağlı olur ve somut sınıflar (&lt;code&gt;SmtpClient&lt;/code&gt;, &lt;code&gt;SendGridEmailClient&lt;/code&gt;) daha esnek bir şekilde değiştirilebilir.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;IEmailClient&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;subject&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;SmtpEmailClient&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;IEmailClient&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;subject&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;$"E-posta gönderildi (SMTP): &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt;, &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;subject&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt;, &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;SendGridEmailClient&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;IEmailClient&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;subject&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;$"E-posta gönderildi (SendGrid): &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt;, &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;subject&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt;, &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;EmailService&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="n"&gt;IEmailClient&lt;/span&gt; &lt;span class="n"&gt;_emailClient&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="c1"&gt;// Dependency Injection ile bağımlılık ekleniyor.&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;EmailService&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IEmailClient&lt;/span&gt; &lt;span class="n"&gt;emailClient&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;_emailClient&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;emailClient&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;SendEmail&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;subject&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;_emailClient&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;subject&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;Esneklik Kazanma:&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Şimdi, &lt;code&gt;EmailService&lt;/code&gt; sınıfı sadece &lt;strong&gt;soyutlama&lt;/strong&gt; olan &lt;code&gt;IEmailClient&lt;/code&gt;'a bağlıdır.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;EmailService&lt;/code&gt;'i değiştirmek zorunda kalmadan, farklı bir e-posta servis sağlayıcısı kullanabiliriz. Mesela &lt;code&gt;SendGridEmailClient&lt;/code&gt; veya &lt;code&gt;SmtpEmailClient&lt;/code&gt; gibi servisleri sadece &lt;code&gt;IEmailClient&lt;/code&gt;'i implement eden sınıfları sağlayarak değiştirebiliriz.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Program&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;IEmailClient&lt;/span&gt; &lt;span class="n"&gt;emailClient&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;SendGridEmailClient&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;  &lt;span class="c1"&gt;// Ya da SmtpEmailClient&lt;/span&gt;
        &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;emailService&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;EmailService&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;emailClient&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="n"&gt;emailService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;SendEmail&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"test@example.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Konu"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"E-posta içeriği"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;Sonuç:&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;DIP'yi ihlal ettiğimizde&lt;/strong&gt;, &lt;code&gt;EmailService&lt;/code&gt; sınıfını değiştirmek zorunda kalırız çünkü doğrudan somut sınıfa bağımlıdır. Yeni bir e-posta servisi eklediğimizde, bu servisin işlevini değiştirebilmek için &lt;code&gt;EmailService&lt;/code&gt;'i de güncellememiz gerekir.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;DIP'yi uyguladığımızda&lt;/strong&gt;, soyutlamalar sayesinde &lt;code&gt;EmailService&lt;/code&gt; sınıfını değiştirmeden yeni bir e-posta servisi ekleyebiliriz. Yüksek seviye modüller (iş mantığı) ve düşük seviye modüller (somut sınıflar) arasında bağımlılık yoktur, sadece soyutlama üzerinden iletişim vardır. Bu da daha esnek ve bakım kolaylığı sağlar.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bu şekilde, bağımlılıkların sıkı olduğu durumlarda, değişiklik yaparken diğer sınıflarda da değişiklik yapmanız kaçınılmaz hale gelir. DIP, bu tür sorunları önleyerek yazılımın daha sürdürülebilir ve esnek olmasını sağlar.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Dependency Inversion Prensibi</title>
      <dc:creator>Mustafa  Çam</dc:creator>
      <pubDate>Wed, 05 Mar 2025 13:21:24 +0000</pubDate>
      <link>https://dev.to/mustafacam/dependency-inversion-prensibi-2a2e</link>
      <guid>https://dev.to/mustafacam/dependency-inversion-prensibi-2a2e</guid>
      <description>&lt;p&gt;&lt;strong&gt;Dependency Inversion Principle (DIP)&lt;/strong&gt;, SOLID prensiplerinden biridir ve yazılımda bağımlılıkları yönetmek için çok önemli bir kavramdır. C# gibi nesne yönelimli dillerde, yazılımın esnekliğini ve bakımını kolaylaştırmak amacıyla kullanılır.&lt;/p&gt;

&lt;p&gt;DIP, iki temel kuraldan oluşur:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Yüksek seviye modüller (veya sınıflar)&lt;/strong&gt;, &lt;strong&gt;düşük seviye modüllere&lt;/strong&gt; bağımlı olmamalıdır. Her iki tür de &lt;strong&gt;abstraksiyonlara&lt;/strong&gt; (soyutlamalara) bağımlı olmalıdır.&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;Yüksek seviye modüller, programın genel işlevselliğini sağlar (örneğin, bir iş mantığı sınıfı).&lt;/li&gt;
&lt;li&gt;Düşük seviye modüller, daha spesifik işlevler sağlar (örneğin, veri erişim sınıfı).&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Abstraksiyonlar&lt;/strong&gt; (interface veya abstract class) &lt;strong&gt;somut sınıflardan&lt;/strong&gt; (concrete classes) bağımsız olmalıdır. &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Örnek ile Açıklama:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Bir örnek üzerinden açıklayalım. Diyelim ki, bir &lt;code&gt;EmailService&lt;/code&gt; sınıfımız var ve bu sınıfın içinde bir &lt;code&gt;SmtpClient&lt;/code&gt;'a bağımlılığı var. Eğer &lt;code&gt;EmailService&lt;/code&gt; doğrudan &lt;code&gt;SmtpClient&lt;/code&gt; sınıfına bağlıysa, bu durum DIP'yi ihlal eder çünkü &lt;code&gt;EmailService&lt;/code&gt; yüksek seviye bir iş mantığı sınıfıyken, &lt;code&gt;SmtpClient&lt;/code&gt; daha düşük seviye bir sınıftır.&lt;/p&gt;

&lt;p&gt;DIP'yi uygularsak, &lt;code&gt;EmailService&lt;/code&gt;'in &lt;code&gt;SmtpClient&lt;/code&gt;'a olan bağımlılığını kaldırabiliriz. Bunun yerine, bir &lt;strong&gt;abstraction (soyutlama)&lt;/strong&gt; olan &lt;code&gt;IEmailClient&lt;/code&gt; adında bir arayüz (interface) oluştururuz ve &lt;code&gt;EmailService&lt;/code&gt; sadece bu arayüze bağımlı olur. Bu şekilde, &lt;code&gt;EmailService&lt;/code&gt; sınıfı daha esnek hale gelir ve farklı e-posta servisleri kullanılabilir.&lt;/p&gt;

&lt;h3&gt;
  
  
  Kod Örneği
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;DIP'yi ihlal eden kod:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;EmailService&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="n"&gt;SmtpClient&lt;/span&gt; &lt;span class="n"&gt;_smtpClient&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;EmailService&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;_smtpClient&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;SmtpClient&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;  &lt;span class="c1"&gt;// Direkt olarak SmtpClient'a bağlı.&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;SendEmail&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;subject&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;_smtpClient&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;subject&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;DIP'yi uygulayan kod:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;IEmailClient&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;subject&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;SmtpEmailClient&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;IEmailClient&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;subject&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// SmtpClient kullanılarak e-posta gönderimi yapılır.&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;EmailService&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="n"&gt;IEmailClient&lt;/span&gt; &lt;span class="n"&gt;_emailClient&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;EmailService&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IEmailClient&lt;/span&gt; &lt;span class="n"&gt;emailClient&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;_emailClient&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;emailClient&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  &lt;span class="c1"&gt;// Artık sadece soyutlamaya (IEmailClient) bağlı.&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;SendEmail&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;subject&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;_emailClient&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;subject&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bu şekilde &lt;code&gt;EmailService&lt;/code&gt; sınıfı &lt;code&gt;IEmailClient&lt;/code&gt; arayüzüne bağlıdır ve artık &lt;code&gt;SmtpClient&lt;/code&gt; gibi somut bir sınıfa doğrudan bağımlı değildir. Böylece:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;EmailService&lt;/code&gt; sınıfı esnek hale gelir, çünkü farklı e-posta gönderme yöntemleri (örneğin, &lt;code&gt;SendGridEmailClient&lt;/code&gt;) kolayca entegre edilebilir.&lt;/li&gt;
&lt;li&gt;Bağımlılıkları yönetmek için &lt;strong&gt;Dependency Injection&lt;/strong&gt; kullanılabilir.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Sonuç:&lt;/strong&gt;&lt;br&gt;
DIP, yazılımın sürdürülebilirliğini artırır, bağımlılıkları yönetmeyi kolaylaştırır ve test edilebilirliği artırır.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>csharp</category>
    </item>
    <item>
      <title>If you think debounce or onblur is not working in React, you can check it.</title>
      <dc:creator>Mustafa  Çam</dc:creator>
      <pubDate>Wed, 01 Jan 2025 16:49:56 +0000</pubDate>
      <link>https://dev.to/mustafacam/if-you-think-debounce-or-onblur-is-not-working-in-react-you-can-check-it-50cd</link>
      <guid>https://dev.to/mustafacam/if-you-think-debounce-or-onblur-is-not-working-in-react-you-can-check-it-50cd</guid>
      <description>&lt;p&gt;Answer: If you have set up a structure to directly see the updated state in order to work with the value value in the input value, onchange, and then you have thought about the logic of debounce or onblur so that it does not render after the state change, and if you are wondering why you cannot enter a value into the input, then the value of the input value is the value of the input value. You can remove the value.&lt;/p&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; &amp;lt;input
                  type="text"
                  name="example"
                  // value={example}  this is the comment line
                  onChange={handleOnchange}
                  className={`w-2/3 p-2`}
                /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;this way onblur and debounce can work.&lt;/p&gt;

</description>
      <category>react</category>
      <category>debounce</category>
      <category>onblur</category>
      <category>reactrender</category>
    </item>
    <item>
      <title>IEnumerable nedir ?</title>
      <dc:creator>Mustafa  Çam</dc:creator>
      <pubDate>Sat, 05 Oct 2024 21:04:11 +0000</pubDate>
      <link>https://dev.to/mustafacam/ienumerable-nedir--2b0c</link>
      <guid>https://dev.to/mustafacam/ienumerable-nedir--2b0c</guid>
      <description>&lt;p&gt;&lt;code&gt;IEnumerable&lt;/code&gt;, C# ve .NET Core'da koleksiyonlar üzerinde işlem yapmak için sıklıkla kullanılan bir arayüzdür (interface). Bu arayüz, bir veri kaynağının üzerinde yineleme (iteration) yapabilmeyi sağlar. &lt;code&gt;IEnumerable&lt;/code&gt;, veri yapısına ya da koleksiyonun nasıl oluşturulduğuna bakılmaksızın, tek tek veri öğelerine erişme yeteneği sunar. Bu, temel olarak koleksiyonlar üzerinde dolaşmak ve verilerle işlem yapmak için kullanılan en yaygın arabirimlerden biridir.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;IEnumerable&lt;/code&gt; Nedir?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;IEnumerable&lt;/code&gt;, temel olarak bir veri koleksiyonunda &lt;strong&gt;ardışık&lt;/strong&gt; veri öğelerine &lt;strong&gt;sadece ileriye doğru&lt;/strong&gt; erişim sağlar.&lt;/li&gt;
&lt;li&gt;Bu arayüz, veri koleksiyonlarını temsil eden sınıflarda kullanılan bir kontrattır. Yani, &lt;code&gt;IEnumerable&lt;/code&gt; arayüzünü uygulayan her sınıf, &lt;code&gt;foreach&lt;/code&gt; döngüsü gibi yapıların kullanılmasını sağlar.&lt;/li&gt;
&lt;li&gt;Koleksiyon türüne bağlı olarak, &lt;code&gt;IEnumerable&lt;/code&gt; koleksiyonun tüm verilerini bellekte tutmak zorunda değildir. Bu da özellikle &lt;strong&gt;lazy evaluation (ertelemeli değerlendirme)&lt;/strong&gt; gibi tekniklerle performans avantajı sağlar.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Generic ve Non-generic Versiyonları
&lt;/h4&gt;

&lt;p&gt;C#'ta &lt;code&gt;IEnumerable&lt;/code&gt; iki temel versiyonla gelir:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;IEnumerable&lt;/code&gt;&lt;/strong&gt; (non-generic): Koleksiyonun elemanlarının türünü belirtmez.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;IEnumerable&amp;lt;T&amp;gt;&lt;/code&gt;&lt;/strong&gt; (generic): Koleksiyonda yer alan elemanların türünü belirtir ve tür güvenliğini sağlar.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;IEnumerable&lt;/code&gt; ve &lt;code&gt;IEnumerator&lt;/code&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;IEnumerable&lt;/code&gt; arayüzü bir &lt;strong&gt;yineleme başlatmak&lt;/strong&gt; için kullanılır. Bu başlatma işini &lt;code&gt;GetEnumerator()&lt;/code&gt; metodu aracılığıyla yapar.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;IEnumerator&lt;/code&gt;, &lt;code&gt;IEnumerable&lt;/code&gt; arayüzünden döndürülen &lt;strong&gt;yineleyicidir&lt;/strong&gt;. Yani, bir koleksiyonun öğeleri arasında dolaşmak için &lt;code&gt;IEnumerator&lt;/code&gt; kullanılır.

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;IEnumerator&lt;/code&gt; şu metodları sağlar:&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MoveNext()&lt;/strong&gt;: Bir sonraki öğeye geçer ve başarı durumunu döner.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Current&lt;/strong&gt;: Şu anda işaret edilen öğeyi döner.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reset()&lt;/strong&gt;: Yineleyiciyi başa döndürür.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;IEnumerable&lt;/code&gt; Kullanımına Örnekler
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Non-generic IEnumerable
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;System&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;System.Collections&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Program&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;ArrayList&lt;/span&gt; &lt;span class="n"&gt;numbers&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;ArrayList&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;5&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;

        &lt;span class="c1"&gt;// IEnumerable interface'ini kullanarak üzerinde gezinme&lt;/span&gt;
        &lt;span class="n"&gt;IEnumerable&lt;/span&gt; &lt;span class="n"&gt;enumerable&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="n"&gt;IEnumerator&lt;/span&gt; &lt;span class="n"&gt;enumerator&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;enumerable&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetEnumerator&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

        &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;enumerator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;MoveNext&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;enumerator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Current&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Açıklama&lt;/strong&gt;: Bu örnekte &lt;code&gt;ArrayList&lt;/code&gt; gibi non-generic bir koleksiyon üzerinde &lt;code&gt;IEnumerable&lt;/code&gt; kullanılarak veriler üzerinde geziniliyor. Burada, &lt;code&gt;GetEnumerator()&lt;/code&gt; ile &lt;code&gt;IEnumerator&lt;/code&gt; nesnesi elde edilip, &lt;code&gt;MoveNext()&lt;/code&gt; ve &lt;code&gt;Current&lt;/code&gt; ile sırayla öğeler işleniyor.&lt;/p&gt;

&lt;h4&gt;
  
  
  Generic &lt;code&gt;IEnumerable&amp;lt;T&amp;gt;&lt;/code&gt;
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;System&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;System.Collections.Generic&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Program&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;fruits&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s"&gt;"Apple"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Banana"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Cherry"&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;

        &lt;span class="c1"&gt;// Generic IEnumerable kullanımı&lt;/span&gt;
        &lt;span class="n"&gt;IEnumerable&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;fruitEnum&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;fruits&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;fruit&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;fruitEnum&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fruit&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Açıklama&lt;/strong&gt;: Burada &lt;code&gt;List&amp;lt;string&amp;gt;&lt;/code&gt; gibi generic bir koleksiyon üzerinde yineleme yapılıyor. &lt;code&gt;IEnumerable&amp;lt;T&amp;gt;&lt;/code&gt; tür güvenliği sağlar ve tip dönüşümleri ile ilgili ekstra işlem yapılmasına gerek kalmaz.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;IEnumerable&lt;/code&gt; ve &lt;code&gt;IEnumerator&lt;/code&gt; İlişkisi
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;IEnumerable&lt;/code&gt;, her ne kadar kendi başına bir koleksiyon üzerinde gezmeyi sağlayan bir arayüz gibi görünse de aslında bu işi &lt;code&gt;IEnumerator&lt;/code&gt; aracılığıyla yapar. &lt;code&gt;IEnumerable&lt;/code&gt;, sadece bir &lt;code&gt;GetEnumerator&lt;/code&gt; metodu sağlar, bu metod ise geri planda &lt;code&gt;IEnumerator&lt;/code&gt; döner. Yani, &lt;code&gt;IEnumerator&lt;/code&gt;, koleksiyonun öğelerine sırayla erişilmesini sağlayan asıl yapıdır.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Özetle, bu ilişki şu şekilde çalışır:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Bir &lt;code&gt;IEnumerable&lt;/code&gt; koleksiyon üzerinde &lt;code&gt;GetEnumerator&lt;/code&gt; çağrıldığında, o koleksiyonun bir yineleyicisi (&lt;code&gt;IEnumerator&lt;/code&gt;) elde edilir.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;IEnumerator&lt;/code&gt;, &lt;code&gt;MoveNext()&lt;/code&gt; metoduyla bir sonraki öğeye geçer ve &lt;code&gt;Current&lt;/code&gt; ile o öğeye erişilir.&lt;/li&gt;
&lt;li&gt;İşlem bittikten sonra &lt;code&gt;Reset()&lt;/code&gt; ile yineleyici başa döndürülebilir (ancak genellikle &lt;code&gt;foreach&lt;/code&gt; kullanıldığında buna gerek kalmaz).&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;IEnumerable&lt;/code&gt; ve &lt;code&gt;IQueryable&lt;/code&gt; Arasındaki Fark
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;IEnumerable&lt;/code&gt;&lt;/strong&gt;: Veriyi bellekte işler ve döner. Yani, veriyi çeker ve döngü içerisinde işleme başlar. Tüm veriler bellekte olduğu için daha küçük veri kümeleriyle çalışmak için uygundur.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;IQueryable&lt;/code&gt;&lt;/strong&gt;: Sorguyu veri kaynağına gönderir ve veri kaynağının (örneğin bir veritabanı) işlemesini sağlar. Büyük veri kümeleriyle çalışırken daha performanslı olabilir çünkü sorgu veritabanında çalıştırılır.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;IEnumerable&lt;/code&gt; ve &lt;code&gt;List&amp;lt;T&amp;gt;&lt;/code&gt; Arasındaki Fark
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;IEnumerable&amp;lt;T&amp;gt;&lt;/code&gt;&lt;/strong&gt;: Koleksiyonun sadece üzerinde gezinmenizi sağlar, veri üzerinde değişiklik yapamazsınız.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;List&amp;lt;T&amp;gt;&lt;/code&gt;&lt;/strong&gt;: Hem veri üzerinde değişiklik yapabilir hem de veriler arasında dolaşabilirsiniz (ekleme, silme, güncelleme gibi).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;IEnumerable&lt;/code&gt;, veri koleksiyonlarını &lt;strong&gt;temsil eder&lt;/strong&gt;; o koleksiyonun kendisi değildir. Bu nedenle, &lt;code&gt;IEnumerable&lt;/code&gt; ile veri üzerinde değişiklik yapmak mümkün değildir. Örneğin, bir &lt;code&gt;List&amp;lt;T&amp;gt;&lt;/code&gt; türü hem koleksiyonu temsil eder hem de veri üzerinde değişiklik yapmanıza olanak tanır.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;IEnumerable&lt;/code&gt;'in Avantajları
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Performans&lt;/strong&gt;: &lt;code&gt;IEnumerable&lt;/code&gt;, özellikle büyük veri kümeleriyle çalışırken &lt;strong&gt;lazy evaluation&lt;/strong&gt; (ertelemeli değerlendirme) kullanarak bellek performansını artırır. Yani, tüm veri setini bellek içine alıp işlemek yerine sadece ihtiyaç duyulan veriler işlenir.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Kolaylık&lt;/strong&gt;: &lt;code&gt;IEnumerable&lt;/code&gt;, koleksiyonlar arasında basit bir iterasyon (yineleme) sağlar ve birden fazla veri türüyle çalışmak için uygundur.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Uyumluluk&lt;/strong&gt;: Farklı veri kaynaklarıyla (diziler, listeler, veritabanları) çalışırken veri üzerinde kolayca dolaşmak mümkündür.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Dezavantajlar
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Sınırlı Erişim&lt;/strong&gt;: &lt;code&gt;IEnumerable&lt;/code&gt; sadece ileriye doğru iterasyon sağlar, yani veriler üzerinde geriye dönük dolaşım yapılamaz.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Yalnızca Okuma&lt;/strong&gt;: &lt;code&gt;IEnumerable&lt;/code&gt; veriyi sadece okumaya yöneliktir, yani koleksiyon üzerinde değişiklik yapmanıza olanak tanımaz.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;IEnumerable&lt;/code&gt; İle &lt;code&gt;yield&lt;/code&gt; Anahtar Kelimesi
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;yield&lt;/code&gt; anahtar kelimesi, &lt;code&gt;IEnumerable&lt;/code&gt; ile birlikte kullanıldığında bir koleksiyonun elemanlarını döndürmek için oldukça kullanışlıdır. Bu, veri işlemeyi daha verimli hale getiren "lazy evaluation" tekniğinin bir parçasıdır.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;System&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;System.Collections.Generic&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Program&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;number&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;GetNumbers&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;number&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="n"&gt;IEnumerable&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;GetNumbers&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Açıklama&lt;/strong&gt;: &lt;code&gt;yield&lt;/code&gt;, her çağrıldığında sıradaki öğeyi döndürür ve kaldığı yerden devam eder. Bu da hafıza tüketimini azaltır ve sadece ihtiyaç duyulan veriyi işleme alır.&lt;/p&gt;

&lt;h3&gt;
  
  
  Sonuç
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;IEnumerable&lt;/code&gt;, C# ve .NET Core'da koleksiyonlar üzerinde dolaşmak için temel bir yapı taşıdır. Esnekliği ve basitliği sayesinde veri kaynakları üzerinde işlem yapmayı kolaylaştırır. Yineleme mantığını &lt;code&gt;IEnumerator&lt;/code&gt; ile sağlar ve veriyi bellek açısından daha verimli işleyebilir. Özellikle büyük veri kümeleriyle çalışırken &lt;code&gt;yield&lt;/code&gt; ve &lt;code&gt;IQueryable&lt;/code&gt; gibi diğer yapılarla birlikte kullanıldığında daha verimli sonuçlar elde edilebilir.&lt;/p&gt;

</description>
      <category>csharp</category>
      <category>dotnet</category>
    </item>
    <item>
      <title>structural directives in Angular</title>
      <dc:creator>Mustafa  Çam</dc:creator>
      <pubDate>Sun, 22 Sep 2024 16:52:34 +0000</pubDate>
      <link>https://dev.to/mustafacam/structural-directives-in-angular-612</link>
      <guid>https://dev.to/mustafacam/structural-directives-in-angular-612</guid>
      <description>&lt;p&gt;Angular'da &lt;strong&gt;&lt;code&gt;*ngIf&lt;/code&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;code&gt;*ngFor&lt;/code&gt;&lt;/strong&gt; gibi yapılar, &lt;strong&gt;yapısal direktifler&lt;/strong&gt; (structural directives) olarak adlandırılır. Bu direktifler, HTML'deki elementlerin yapısını değiştirmek veya kontrol etmek için kullanılır.&lt;/p&gt;

&lt;h3&gt;
  
  
  Yapısal Direktifler Nedir?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Yapısal direktifler, HTML DOM ağacında &lt;strong&gt;elementleri ekleyip kaldırmaya&lt;/strong&gt; yarayan direktiflerdir.&lt;/li&gt;
&lt;li&gt;Bu direktifler, bileşenlerin veya sayfaların görünümünü dinamik olarak değiştirmemize olanak tanır.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;*&lt;/code&gt;&lt;/strong&gt; işareti, bu direktiflerin yapısal olduğunu ifade eder. Bu işaret Angular tarafından kısa bir gösterim olarak kabul edilir ve aslında bu direktiflerin DOM elementini manipüle ettiğini belirtir.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  En Yaygın Yapısal Direktifler:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;*ngIf&lt;/code&gt;&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Belirtilen koşul doğruysa (true) HTML elementini DOM'a ekler, aksi takdirde çıkarır.&lt;/li&gt;
&lt;li&gt;Örnek:
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt; &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;*ngIf=&lt;/span&gt;&lt;span class="s"&gt;"isVisible"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Bu metin sadece 'isVisible' true olduğunda görünür.&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;*ngFor&lt;/code&gt;&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Bir dizi veya koleksiyon üzerinde döngü yaparak HTML elementlerini tekrarlar.&lt;/li&gt;
&lt;li&gt;Örnek:
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt; &lt;span class="nt"&gt;&amp;lt;ul&amp;gt;&lt;/span&gt;
   &lt;span class="nt"&gt;&amp;lt;li&lt;/span&gt; &lt;span class="na"&gt;*ngFor=&lt;/span&gt;&lt;span class="s"&gt;"let item of items"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;{{ item }}&lt;span class="nt"&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
 &lt;span class="nt"&gt;&amp;lt;/ul&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;*ngSwitch&lt;/code&gt;&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Belirli bir duruma göre farklı bileşen veya elementleri görüntülemek için kullanılır.&lt;/li&gt;
&lt;li&gt;Örnek:
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt; &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;[ngSwitch]=&lt;/span&gt;&lt;span class="s"&gt;"day"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
   &lt;span class="nt"&gt;&amp;lt;p&lt;/span&gt; &lt;span class="na"&gt;*ngSwitchCase=&lt;/span&gt;&lt;span class="s"&gt;"'Monday'"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Bugün Pazartesi&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
   &lt;span class="nt"&gt;&amp;lt;p&lt;/span&gt; &lt;span class="na"&gt;*ngSwitchCase=&lt;/span&gt;&lt;span class="s"&gt;"'Tuesday'"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Bugün Salı&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
   &lt;span class="nt"&gt;&amp;lt;p&lt;/span&gt; &lt;span class="na"&gt;*ngSwitchDefault&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Bugün Hafta Sonu&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
 &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Direktif Türleri:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Yapısal Direktifler&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;HTML'deki elementlerin yapısını değiştirir (ekler veya çıkarır).&lt;/li&gt;
&lt;li&gt;Örnekler: &lt;code&gt;*ngIf&lt;/code&gt;, &lt;code&gt;*ngFor&lt;/code&gt;, &lt;code&gt;*ngSwitch&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Öznitelik Direktifleri (Attribute Directives)&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Bir elementin görünümünü veya davranışını değiştirir, ancak elementin yapısını değiştirmez.&lt;/li&gt;
&lt;li&gt;Örnek: &lt;code&gt;[ngClass]&lt;/code&gt;, &lt;code&gt;[ngStyle]&lt;/code&gt;, &lt;code&gt;ngModel&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Özet:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;*ngIf&lt;/code&gt;&lt;/strong&gt; ve &lt;strong&gt;&lt;code&gt;*ngFor&lt;/code&gt;&lt;/strong&gt; gibi özelliklere &lt;strong&gt;yapısal direktifler&lt;/strong&gt; denir.&lt;/li&gt;
&lt;li&gt;Yapısal direktifler, DOM üzerinde elementleri dinamik olarak ekleyip kaldırır.&lt;/li&gt;
&lt;li&gt;Angular'da ayrıca &lt;strong&gt;öznitelik direktifleri&lt;/strong&gt; de vardır ve bunlar elementin stilini veya davranışını değiştirir.&lt;/li&gt;
&lt;/ul&gt;

</description>
    </item>
    <item>
      <title>@Injectable() in Angular</title>
      <dc:creator>Mustafa  Çam</dc:creator>
      <pubDate>Sun, 22 Sep 2024 16:04:22 +0000</pubDate>
      <link>https://dev.to/mustafacam/injectable-in-angular-g19</link>
      <guid>https://dev.to/mustafacam/injectable-in-angular-g19</guid>
      <description>&lt;p&gt;Evet, Angular 6 ve üzeri versiyonlarda, servislerin &lt;strong&gt;&lt;code&gt;@Injectable()&lt;/code&gt;&lt;/strong&gt; dekoratörüyle birlikte &lt;code&gt;providedIn&lt;/code&gt; özelliği kullanılarak &lt;strong&gt;&lt;code&gt;providers&lt;/code&gt;&lt;/strong&gt; kısmına yazmadan da servisleri kullanabiliyorsunuz. Bu, Angular'ın dependency injection (bağımlılık enjeksiyonu) sisteminin bir parçasıdır ve servislerin uygulamanın genelinde ya da belirli modüllerde nasıl sağlanacağını kontrol eder.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;@Injectable({ providedIn: 'root' })&lt;/code&gt; Ne Anlama Gelir?
&lt;/h3&gt;

&lt;p&gt;Angular'da servisler, modüller ve bileşenler arasındaki ortak işlevleri sağlamak için kullanılır. Bir servisin nerede kullanılacağını belirtmek için iki temel yol vardır:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;@Injectable()&lt;/code&gt; ile &lt;code&gt;providedIn&lt;/code&gt; kullanmak&lt;/strong&gt;: Servisin hangi modülde veya kapsamda sağlanacağını belirtir.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Modülün &lt;code&gt;providers&lt;/code&gt; kısmına servis eklemek&lt;/strong&gt;: Bu eski yöntemdir ve genellikle hala geçerlidir, ancak Angular 6 ile birlikte &lt;code&gt;providedIn&lt;/code&gt; özelliği daha yaygın hale geldi.&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;
  
  
  Örnek: &lt;code&gt;providedIn: 'root'&lt;/code&gt;
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Injectable&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@angular/core&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;Injectable&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;providedIn&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;root&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;  &lt;span class="c1"&gt;// Bu servis uygulamanın kök seviyesinde (global) sağlanır.&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;UserService&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;providedIn: 'root'&lt;/code&gt;&lt;/strong&gt;: Bu özellik, Angular'a bu servisi &lt;strong&gt;uygulamanın genelinde&lt;/strong&gt; sağlayacağını (singleton olarak) bildirir. Yani servis &lt;strong&gt;app.module.ts&lt;/strong&gt; dosyasının &lt;code&gt;providers&lt;/code&gt; kısmına eklenmesine gerek kalmaz.&lt;/li&gt;
&lt;li&gt;Bu sayede servis, uygulamanın herhangi bir bileşeninde veya başka bir serviste doğrudan &lt;strong&gt;constructor&lt;/strong&gt; ile kullanılabilir.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Neden &lt;code&gt;providers&lt;/code&gt; Alanına Eklemeye Gerek Yok?
&lt;/h3&gt;

&lt;p&gt;Angular'ın yeni sürümleriyle birlikte &lt;code&gt;providedIn&lt;/code&gt; ile servislerin uygulamanın global scope'unda veya belirli modüllerde sağlanmasını sağlıyoruz. Bu şu avantajları getirir:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Daha Basit ve Temiz Kod&lt;/strong&gt;: &lt;code&gt;providers&lt;/code&gt; kısmına eklemeye gerek kalmaz.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ağaç Sallama (Tree Shaking)&lt;/strong&gt;: Eğer servis hiçbir yerde kullanılmazsa, Angular uygulamanın derlemesi sırasında bu servisi koddan kaldırabilir (daha küçük bundle boyutu).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Global veya Modül Bazında Sağlanabilirlik&lt;/strong&gt;: &lt;code&gt;providedIn&lt;/code&gt; ile servisin globalde mi yoksa sadece belirli bir modülde mi sağlanacağını belirleyebilirsiniz.&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;
  
  
  Eğer Modül Bazında Sağlamak İsterseniz:
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;Injectable&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;providedIn&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;SomeModule&lt;/span&gt;  &lt;span class="c1"&gt;// Bu servis sadece SomeModule içinde kullanılabilir.&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;SomeService&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bu durumda servis yalnızca &lt;code&gt;SomeModule&lt;/code&gt; yüklendiğinde aktif hale gelir ve kullanılabilir.&lt;/p&gt;

&lt;h3&gt;
  
  
  Eski Yöntem: &lt;code&gt;providers&lt;/code&gt; Kısmına Servis Ekleme
&lt;/h3&gt;

&lt;p&gt;Eski Angular sürümlerinde veya bazı durumlarda, servisleri modülün &lt;code&gt;providers&lt;/code&gt; kısmına ekleyerek kullanılabilir hale getirirdik. Örneğin:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;NgModule&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@angular/core&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;CommonModule&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@angular/common&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;UserService&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./user.service&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;NgModule&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;imports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;CommonModule&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="na"&gt;providers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;UserService&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;  &lt;span class="c1"&gt;// Servis burada tanımlanır&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;UserModule&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ancak artık bu yönteme çoğunlukla gerek kalmamıştır, çünkü &lt;code&gt;providedIn&lt;/code&gt; daha modern ve kullanışlı bir yaklaşımdır.&lt;/p&gt;

&lt;h3&gt;
  
  
  Özet:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;@Injectable({ providedIn: 'root' })&lt;/code&gt;&lt;/strong&gt; ile servisler global olarak sağlanır, bu nedenle &lt;code&gt;providers&lt;/code&gt; kısmına eklemeye gerek kalmaz.&lt;/li&gt;
&lt;li&gt;Eğer servisi belirli bir modülde sağlamak isterseniz, &lt;code&gt;providedIn&lt;/code&gt; parametresiyle modülü belirtebilirsiniz.&lt;/li&gt;
&lt;li&gt;Eski yöntem olan &lt;code&gt;providers&lt;/code&gt; kısmına servis eklemek hala geçerli bir yöntemdir, ancak genellikle &lt;code&gt;providedIn&lt;/code&gt; yaklaşımı tercih edilir çünkü daha basit ve verimlidir.&lt;/li&gt;
&lt;/ul&gt;

</description>
    </item>
    <item>
      <title>Lazy loading vs Eager loading</title>
      <dc:creator>Mustafa  Çam</dc:creator>
      <pubDate>Wed, 18 Sep 2024 13:38:01 +0000</pubDate>
      <link>https://dev.to/mustafacam/lazy-loading-vs-eager-loading-bb7</link>
      <guid>https://dev.to/mustafacam/lazy-loading-vs-eager-loading-bb7</guid>
      <description>&lt;p&gt;&lt;strong&gt;Eager Loading&lt;/strong&gt; ve &lt;strong&gt;Lazy Loading&lt;/strong&gt; iki farklı veri yükleme stratejisidir ve Entity Framework Core'da ilişkili verilerle çalışma şeklini etkiler. İşte bu iki yöntem arasındaki temel farklar:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Eager Loading (Önceden Yükleme)
&lt;/h3&gt;

&lt;p&gt;Eager Loading, ilişkili verilerin &lt;strong&gt;sorgu yapıldığında&lt;/strong&gt; hemen yüklenmesini sağlar. Bu yöntem, ilişkili verilerin aynı anda ve tek bir sorgu içinde getirilmesini sağlar. Genellikle &lt;code&gt;Include&lt;/code&gt; metodunu kullanarak ilişkili verileri yükleyebilirsiniz.&lt;/p&gt;

&lt;h4&gt;
  
  
  Özellikleri:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Veri Çekme&lt;/strong&gt;: İlişkili veriler, ana verilerle birlikte tek bir sorguda getirilir.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Performans&lt;/strong&gt;: Birden fazla sorgu yapmak yerine, ilişkili verilerle birlikte tek bir sorgu gönderildiği için performans avantajı sağlar. Ancak, çok büyük veri setlerinde bu sorguların performansı etkilenebilir.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Kullanım&lt;/strong&gt;: İlişkili verileri her zaman kullanmanız gerekiyorsa uygun bir yöntemdir.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Örnek:
&lt;/h4&gt;

&lt;p&gt;Bir öğrenci ve onun derslerini aynı anda getirmek istiyorsanız:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;students&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Students&lt;/span&gt;
                      &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Include&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Courses&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// Öğrencinin derslerini de getirir&lt;/span&gt;
                      &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ToList&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Lazy Loading (Tembel Yükleme)
&lt;/h3&gt;

&lt;p&gt;Lazy Loading, ilişkili verilerin &lt;strong&gt;yalnızca ihtiyaç duyulduğunda&lt;/strong&gt; yüklenmesini sağlar. İlk sorguda yalnızca ana veri getirilir ve ilişkili veriler, erişilmeye çalışıldığında dinamik olarak veritabanından yüklenir. Lazy Loading, genellikle &lt;code&gt;virtual&lt;/code&gt; keyword ile ilişkilendirilmiş navigation property'leri kullanır.&lt;/p&gt;

&lt;h4&gt;
  
  
  Özellikleri:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Veri Çekme&lt;/strong&gt;: İlişkili veriler yalnızca erişildiğinde yüklenir. İlk başta yalnızca ana veriler getirilir.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Performans&lt;/strong&gt;: Gereksiz veri yüklemesi önlenir, ancak ilişkili verilere erişildiğinde ek sorgular yapılır. Bu, büyük veri setlerinde fazla sorgu yapılmasına neden olabilir.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Kullanım&lt;/strong&gt;: İlişkili verilere genellikle ihtiyaç duyulmuyorsa veya sadece bazı durumlarda erişilmesi gerekiyorsa uygun bir yöntemdir.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Örnek:
&lt;/h4&gt;

&lt;p&gt;Bir öğrenci verisini aldıktan sonra, derslere yalnızca ihtiyacınız olduğunda erişmek istiyorsanız:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;student&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Students&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Sadece öğrenci verisi getirilir&lt;/span&gt;

&lt;span class="c1"&gt;// İlişkili dersler, öğrenciye erişildikten sonra gerektiğinde yüklenir&lt;/span&gt;
&lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;course&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;student&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Courses&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;course&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CourseName&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Bu noktada Courses verisi getirilir&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Karşılaştırma
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Sorgu Sayısı&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Eager Loading&lt;/strong&gt;: Tek bir sorgu ile ana ve ilişkili verileri getirebilir. Performans genellikle daha iyi olabilir, ancak büyük veri setlerinde veri aşırı yüklenmesine neden olabilir.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lazy Loading&lt;/strong&gt;: İlişkili veriler için ek sorgular yapar. İlişkilere erişildiğinde daha fazla sorgu yapıldığı için performans problemleri yaşanabilir.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Veri Miktarı&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Eager Loading&lt;/strong&gt;: Daha fazla veri getirir çünkü ilişkili veriler de yüklenir. Bu, gereksiz veri getirilmesine neden olabilir.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lazy Loading&lt;/strong&gt;: Sadece erişildiğinde ilişkili veriler yüklenir, böylece gereksiz veriler getirilmez.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Performans&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Eager Loading&lt;/strong&gt;: Genellikle daha performanslı olabilir çünkü sadece bir sorgu yaparak tüm gerekli veriler getirilir.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lazy Loading&lt;/strong&gt;: Ek sorgular gerektirdiği için bazı durumlarda performans sorunlarına yol açabilir.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  Özet
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Eager Loading&lt;/strong&gt;: İlişkili verileri, ana verilerle birlikte önceden yükler. Tek bir sorguda tüm veriler getirilir, bu da performans avantajı sağlar ancak büyük veri setlerinde veritabanı aşırı yüklenmesine neden olabilir.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lazy Loading&lt;/strong&gt;: İlişkili verileri yalnızca ihtiyaç duyulduğunda yükler. İlk sorguda sadece ana veriler getirilir, ilişkili verilere erişildiğinde ek sorgular yapılır. Performansı artırabilir, ancak çok sayıda sorgu yapabilir.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Kullanım senaryonuza bağlı olarak bu yöntemlerden birini seçebilirsiniz. Örneğin, ilişkili verilere her zaman ihtiyacınız varsa &lt;strong&gt;eager loading&lt;/strong&gt;, yalnızca bazı durumlarda ihtiyaç duyuyorsanız &lt;strong&gt;lazy loading&lt;/strong&gt; tercih edilebilir.&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
