<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by Yasar Can on Medium]]></title>
        <description><![CDATA[Stories by Yasar Can on Medium]]></description>
        <link>https://medium.com/@yasarcan?source=rss-1433ebcf8624------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/1*NJ1xHtBZ36BnHZKE9vqR0A.jpeg</url>
            <title>Stories by Yasar Can on Medium</title>
            <link>https://medium.com/@yasarcan?source=rss-1433ebcf8624------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Wed, 27 May 2026 06:53:04 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@yasarcan/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com" rel="hub"/>
        <item>
            <title><![CDATA[Dotnet ve Nosql’ le İlişkili Tasarım Örneği]]></title>
            <link>https://yasarcan.medium.com/dotnet-ve-nosql-le-i%CC%87li%C5%9Fkili-tasar%C4%B1m-%C3%B6rne%C4%9Fi-ba4bde626e30?source=rss-1433ebcf8624------2</link>
            <guid isPermaLink="false">https://medium.com/p/ba4bde626e30</guid>
            <category><![CDATA[mongodb]]></category>
            <category><![CDATA[relationships]]></category>
            <category><![CDATA[türkçe]]></category>
            <category><![CDATA[nosql]]></category>
            <category><![CDATA[dotnet]]></category>
            <dc:creator><![CDATA[Yasar Can]]></dc:creator>
            <pubDate>Sat, 27 Jan 2024 13:29:14 GMT</pubDate>
            <atom:updated>2024-01-27T15:13:22.232Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*kG798PR1JvzrDGwgiFbbFw.jpeg" /></figure><p>Neden SQL veya neden <strong>NoSQL(Non-relational)</strong> bunlara girmeye gerek olmadığını düşünüyorum, zaten bunlarla ilgili yazılar olduğu için geçiyorum.</p><p>Peki, SQL (Relational Database Management System) lerde nasıl ilişki kurulduğunu hepimiz biliyoruz değil mi? Fakat iş NoSQL e geldiği zaman pekte bir ilişkili tasarım örneklerini göremiyoruz. Oysa ki ilişki kurmak illaki projemizin tasarımına göre gerekli oluyor. Peki NoSQL kullandığımız bir sitemde tasarım kuramıyacak mıyız? Many to one, one to one nerede?Bunları tabiki kuracağız. Fakat burada tasarım normal SQL e göre farklı.</p><p>Sonuçta burada bir document bazı sistemle çalışıyoruz ve SQL de olan ilişki sistemi söz konusu değil.</p><p>NoSQL de iki çeşit ilişki sistemi bulunuyor:</p><ul><li>Embeded</li><li>Reference</li></ul><p><strong>Embeded Relationships</strong></p><p>Bu yaklaşım, bir belge içinde başka bir belgenin yerleştirilmesini sağlar. Örneğin, bir kullanıcının profili ve o kullanıcının gönderdiği mesajlar aynı belge içinde tutulabilir. Bu yöntem, bir belge içindeki ilişkili verilerin birlikte saklanması gerektiğinde kullanışlıdır.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/423/1*eLZqId9e4Rl-2JxyLKoiOA.png" /><figcaption><a href="https://www.mongodb.com/docs/manual/tutorial/model-embedded-one-to-many-relationships-between-documents/">Model One-to-Many Relationships with Embedded Documents — MongoDB Manual</a></figcaption></figure><p><strong>Referenced Relationships</strong></p><p>Referanslı ilişkilerde, bir belge başka bir belgeyi referans eder, ancak belge kendisi içinde tutulmaz. Örneğin, bir kullanıcı belgesi, kullanıcının profiline ait bir referans anahtarı içerebilir ve bu referans anahtarı başka bir koleksiyonda (örneğin, profiller koleksiyonu) bulunan profili işaret eder.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/534/1*AjA4essirGDoAi8bIQ9w5g.png" /><figcaption>Kullanım 1</figcaption></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/507/1*kHibM9XfoA6eGlXJUNKygg.png" /><figcaption>Kullanım 2</figcaption></figure><p><strong>Örnek Bir Blog Projesi</strong></p><p>Bir blog sitesi yaptığımızı düşünelim. Burada bir author var ve bu authorun birden fazla postları var, buradaki ilişki türü ise one-to-many olacak şekilde bir tasarım yapacağımızı düşebiliriz.</p><p><strong>Entities:</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*2R7JJ2qtO2tV4c1xxVYqBQ.png" /></figure><p>Post eklerken authorla ilişki nasıl kuracağız?</p><pre>public async Task AddPostAsync(AddPostModel addPostModel)<br>{<br>    var author = await _authorCollection.Find(x =&gt; x.Id == ObjectId.Parse(addPostModel.AuthorId)).FirstOrDefaultAsync();<br><br>    if (author == null)<br>    {<br>        throw new NotFoundException();<br>    }<br><br>    var post = _mapper.Map&lt;Post&gt;(addPostModel);<br>    await _postCollection.InsertOneAsync(post);<br><br>    var filter = Builders&lt;Author&gt;.Filter.Eq(x =&gt; x.Id, ObjectId.Parse(addPostModel.AuthorId));<br>    var update = Builders&lt;Author&gt;.Update.Push(a =&gt; a.PostIds, post.Id);<br><br>    await _authorCollection.UpdateOneAsync(filter, update);<br>}</pre><p>Burada post eklerken ayriyetten authorumuzun PostIds dizisi kısmına postumuzun id sini ekliyoruz. Ayrıca postun içindeki AuthorId kısmına authorid sini ekliyoruz. Böylelikle yukarıdaki her iki kullanımıda kullanmış olduk.</p><p><em>Author Document:</em></p><pre>{<br>  &quot;_id&quot;: {<br>    &quot;$oid&quot;: &quot;65a93defc04e1135dcf5aff9&quot;<br>  },<br>  &quot;CreatedAt&quot;: {<br>    &quot;$date&quot;: &quot;2024-01-18T15:04:15.548Z&quot;<br>  },<br>  &quot;Username&quot;: &quot;malenes123&quot;,<br>  &quot;Email&quot;: &quot;malenes@gmail.com&quot;,<br>  &quot;FirstName&quot;: &quot;enes&quot;,<br>  &quot;LastName&quot;: &quot;can&quot;,<br>  &quot;PasswordHash&quot;: {<br>    &quot;$binary&quot;: {<br>      &quot;base64&quot;: &quot;0OiklIBRdDArwAwBvhELYXxQZpZxcRLznLLOykwS6udoeKqbrU4jhbQZu8YB6jeBwVS0YsJV37E3n92y9aOEoQ==&quot;,<br>      &quot;subType&quot;: &quot;00&quot;<br>    }<br>  },<br>  &quot;PasswordSalt&quot;: {<br>    &quot;$binary&quot;: {<br>      &quot;base64&quot;: &quot;SYo4Izl/R7Wt8fsd66Q0mGC2HMlzwzTxUpPZjs3fzoZXDCmPuXNBItCp3En5vrcyl1JmyskdvEYO6mzRzvW9isvbjlfLD70eqPfA60S/dnEYEAd0RXYoi/eMdLZ/rlG9F65BR1tu29lvmyo/Tu8Yc7zjGYJiB82zSIIDUUwa31k=&quot;,<br>      &quot;subType&quot;: &quot;00&quot;<br>    }<br>  },<br>  &quot;PostIds&quot;: [<br>    {<br>      &quot;$oid&quot;: &quot;65aac0bc9c2a1e222c07355e&quot;<br>    }<br>  ]<br>}</pre><p><em>Post Document:</em></p><pre>{<br>  &quot;_id&quot;: {<br>    &quot;$oid&quot;: &quot;65aac0bc9c2a1e222c07355e&quot;<br>  },<br>  &quot;CreatedAt&quot;: {<br>    &quot;$date&quot;: &quot;2024-01-19T18:34:36.933Z&quot;<br>  },<br>  &quot;Title&quot;: &quot;.NET Projesinde Rest Servise Nasıl İstek Atılır?&quot;,<br>  &quot;Content&quot;: &quot;Bu yazımda Rest Service’e nasıl istek atabileceğiniz ile ilgili olcaktır. Bunun birden fazla yolu olsa da bu yazıda sizlere en yaygın ve performanslı yönetmenlerden biri olan RestSharp’ı göstereceğim. Bunun yerine HttpClientkütüphanesini de kullanabilirsiniz fakat bu yazımda HttpClient’ten bahsetmeyeceğim. Yazılımın diğer kısımlarında da olduğu gibi burada da kullanımın tek bir doğrusu yoktur.HttpClient vs RestSharp Bu yazı RestSharp vs HttpClient olmadığından dolayı bu konudan bahsetmeyeceğim. Aşağıdaki linkten bu konunun devamını araştırmak istiyorsanız sizlere bir link bıraktım. HttpClient vs RestSharp - Which One to Use in .NET - Code Maze HttpClient and RestSharp are HTTP Client libraries that we can use to consume APIs.&quot;,<br>  &quot;Thumbnail&quot;: &quot;assets/images/blog/blog-post-thumb-1.jpg&quot;,<br>  &quot;Tags&quot;: [<br>    &quot;falan&quot;,<br>    &quot;filan&quot;<br>  ],<br>  &quot;AuthorId&quot;: {<br>    &quot;$oid&quot;: &quot;65a93defc04e1135dcf5aff9&quot;<br>  },<br>  &quot;UpdatedAt&quot;: null<br>}</pre><p>Postları author ile birlikte getirmek için</p><pre>public async Task&lt;List&lt;GetPostsModel&gt;&gt; GetPostsAsync()<br>{<br>    var posts = await _postCollection.Find(_ =&gt; true).ToListAsync();<br><br>    var authorIds = posts.Select(post =&gt; post.AuthorId).ToList();<br>    var authorProjection = Builders&lt;Author&gt;.Projection<br>        .Include(p =&gt; p.Username)<br>        .Include(p =&gt; p.FirstName)<br>        .Include(p =&gt; p.LastName);<br>    var authors = await _authorCollection.Find(author =&gt; authorIds.Contains(author.Id)).Project&lt;Author&gt;(authorProjection).ToListAsync();<br><br>    var postsModel = posts.Select(post =&gt; new GetPostsModel<br>    {<br>        Title = post.Title,<br>        Content = post.Content.Substring(0, 300) + &quot;...&quot;,<br>        FullName = authors.FirstOrDefault(author =&gt; author.Id == post.AuthorId)?.FirstName + &quot; &quot; + authors.FirstOrDefault(author =&gt; author.Id == post.AuthorId)?.LastName,<br>        AuthorUsername = authors.FirstOrDefault(author =&gt; author.Id == post.AuthorId)?.Username,<br>        AverageReadingTime = CalculateAverageReadingTime(post.Content),<br>        Thumbnail = post.Thumbnail,<br>        CreatedAt = post.CreatedAt<br>    }).ToList();<br><br>    return postsModel;<br>}</pre><p>Request response:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/811/1*GcP0jK_VxHVOjsZb0xBnFA.png" /></figure><p>Ayrıca postu sildiğimizde <strong>authorun PostIds kısmından silmemiz gerekiyor</strong>, Post silme ise:</p><pre>public async Task DeletePostAsync(ObjectId postId)<br>{<br>    var post = await _postCollection.Find(x =&gt; x.Id == postId).FirstOrDefaultAsync();<br>    var deleteResult = await _postCollection.DeleteOneAsync(x =&gt; x.Id == postId);<br><br>    if (deleteResult.DeletedCount == 0 || post == null)<br>    {<br>        throw new NotFoundException();<br>    }<br><br>    var filter = Builders&lt;Author&gt;.Filter.Eq(x =&gt; x.Id, post.AuthorId);<br>    var update = Builders&lt;Author&gt;.Update.Pull(u =&gt; u.PostIds, postId);<br><br>    var updateResult = await _authorCollection.UpdateOneAsync(filter, update);<br>}</pre><p><strong>Teşekkürler…</strong></p><p><a href="https://github.com/mas963">mas963 (Yasar Can) (github.com)</a></p><p><a href="https://www.linkedin.com/in/ya%C5%9Far-can/">LinkedIn</a></p><p>Kaynakça:</p><p><a href="https://www.mongodb.com/docs/manual/applications/data-models-relationships/">Model Relationships Between Documents — MongoDB Manual</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=ba4bde626e30" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[.NET Consol Uygulamasında RapidApi Kullanarak F1 Takımı İstatistiklerini Çekmek.]]></title>
            <link>https://yasarcan.medium.com/net-consol-uygulamas%C4%B1nda-rapidapi-kullanarak-f1-tak%C4%B1m%C4%B1-i%CC%87statistiklerini-%C3%A7ekmek-d2000ae39518?source=rss-1433ebcf8624------2</link>
            <guid isPermaLink="false">https://medium.com/p/d2000ae39518</guid>
            <category><![CDATA[api]]></category>
            <category><![CDATA[console-application]]></category>
            <category><![CDATA[rapidapi]]></category>
            <category><![CDATA[dotnet]]></category>
            <category><![CDATA[formula-1]]></category>
            <dc:creator><![CDATA[Yasar Can]]></dc:creator>
            <pubDate>Sun, 25 Dec 2022 10:23:43 GMT</pubDate>
            <atom:updated>2022-12-25T10:23:43.487Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*7jFaiwsrgFHZnT8x" /><figcaption>Photo by <a href="https://unsplash.com/@philipmyr?utm_source=medium&amp;utm_medium=referral">Philip Myrtorp</a> on <a href="https://unsplash.com?utm_source=medium&amp;utm_medium=referral">Unsplash</a></figcaption></figure><p>İlk yazım olan bu yazımda sizlere çok hoşuma giden aynı zamanda da basit olduğunu düşündüğüm bir konsol uygulaması yazacağız. Aslında burada asıl amaç C# ile konsol uygulamasında API nasıl çekeriz olacak diyebiliriz. Burada siz Windows Form, Web uygulaması da kullanabilirsiniz.</p><p>Öncelikle Api nin ne olduğunu bildiğinizi var sayarak başlayacağım. Ben bu apiyi kendim yazmak yerine internette ücretsiz kullanabileceğim servislerden yararlanacağım. Bu servis ne derseniz RapidApi denilen, içinde bir sürü Api servisleri bulunduran bir web sitesi.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*6grmanWfi-iLr3s8OdKIZQ.jpeg" /><figcaption>(RapidApi Web Sitesi) <a href="https://rapidapi.com/kpeshterski/api/fia-formula-1-championship-statistics">https://rapidapi.com/kpeshterski/api/fia-formula-1-championship-statistics</a></figcaption></figure><p>RapidApi ye kayıt olduktan sonra Yukarıdaki görülen api ye ücretsiz bir şekilde abone oluyorum. Bu abonelik sayesinde bana verdiği özel key ile erişim sağlayabiliyorum(Tabii ki sınırlı bir request sayısı bulunuyor).</p><p>C# Dilinde bir Code Snippets i alıyoruz:</p><pre>var client = new HttpClient();<br>var request = new HttpRequestMessage<br>{<br> Method = HttpMethod.Get,<br> RequestUri = new Uri(&quot;https://fia-formula-1-championship-statistics.p.rapidapi.com/api/teams&quot;),<br> Headers =<br> {<br>  { &quot;X-RapidAPI-Key&quot;, &quot;KEY&quot; },<br>  { &quot;X-RapidAPI-Host&quot;, &quot;fia-formula-1-championship-statistics.p.rapidapi.com&quot; },<br> },<br>};<br>using (var response = await client.SendAsync(request))<br>{<br> response.EnsureSuccessStatusCode();<br> var body = await response.Content.ReadAsStringAsync();<br> Console.WriteLine(body);<br>}</pre><p>Bu şekilde bize hazır yazılmış bir C# kodu veriyor.</p><p>Gelelim şimdi Konsol projemizi oluşturmaya. Ben NET7 konsol uygulaması oluşturuyorum.</p><p><strong>Properylerin Oluşturulması</strong></p><p>Program.cs de bana gerekli olan classlarımı ve properylerimi oluşturuyorum.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/422/1*g8rYaRJ71uqr8c9UaVEfIA.jpeg" /><figcaption>Gerekli Propert ve Classlar</figcaption></figure><p>Bu gerekli classlar ve properyleri neye göre oluşturuyorum?</p><p>Bu objeleri bana jsondan gelen veriye göre oluşturuyorum. Gelin bana json ile neler geliyor bakalım.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/707/1*ymYrlIRihASyM1MBqyYpxA.jpeg" /><figcaption>Test Endpoint</figcaption></figure><p>Görüldüğü üzere Endpoint e istek yaptığımızda bize gelen bilgileri görebiliyoruz. Bu isteği yapmanın bir çok yolu var. İsterseniz RapidApi web sitesinden yapabilir veya Postman ile yapabilirsiniz. (Postman’da istek yaparken Header parametrelerini unutmayın)</p><p>Buradaki istekte görülen kısımları Classlar ve Properyler oluşturarak gelen istekleri karşılayabiliyorum.</p><blockquote><em>Jsondan Property oluşturmada Visual Studio kullanarak kısayoldan oluşturmak:</em></blockquote><blockquote><em>Edit -&gt; Paste Special -&gt; Paste JSON As Classes</em></blockquote><blockquote>Bu yöntem ile gelen jsonumuzu kopyalarak bu pencereye yapıştırdığımızda bize otomatik propertylerimizi oluşturacaktır.</blockquote><pre>class Program<br>{<br>    public static async Task Main(string[] args)<br>    {<br>        var client = new HttpClient();<br>        var request = new HttpRequestMessage<br>        {<br>            Method = HttpMethod.Get,<br>            RequestUri = new Uri(&quot;https://fia-formula-1-championship-statistics.p.rapidapi.com/api/teams&quot;),<br>            Headers =<br>    {<br>        { &quot;X-RapidAPI-Key&quot;, &quot;KEY&quot; },<br>        { &quot;X-RapidAPI-Host&quot;, &quot;fia-formula-1-championship-statistics.p.rapidapi.com&quot; },<br>    },<br>        };<br>        using (var response = await client.SendAsync(request))<br>        {<br>            response.EnsureSuccessStatusCode();<br>            var body = await response.Content.ReadAsStringAsync();<br><br>            // body ile gelen jsona DeserializeObject kullanıyorum<br>            dynamic jsonObj = JsonConvert.DeserializeObject&lt;Rootobject&gt;(body) ?? throw new Exception();<br><br>            // foreach ile yazdırma işlemi yapıyorum<br>            foreach (var obj in jsonObj.teams)<br>            {<br>                Console.WriteLine(&quot;Team Name: &quot; + obj.teamName);<br>                Console.WriteLine(&quot;Rank: &quot; + obj.rank.standing);<br>                Console.WriteLine(&quot;Point: &quot; + obj.points.pts);<br>                Console.WriteLine(&quot;1. Driver Name: &quot; + obj.drivers[0].firstname);<br>                Console.WriteLine(&quot;2. Driver Name: &quot; + obj.drivers[1].firstname);<br>                Console.WriteLine(&quot;-------------------&quot;);<br>            }<br>        }<br>    }<br>}</pre><p>Görüldüğü üzere bize verilen kodda ufak değişiklikler yapıyorum bu değişiklikler şu şekilde:</p><pre>// body ile gelen jsona DeserializeObject kullanıyorum<br>dynamic jsonObj = JsonConvert.DeserializeObject&lt;Rootobject&gt;(body) ?? throw new Exception();<br><br>// foreach ile yazdırma işlemi yapıyorum<br>foreach (var obj in jsonObj.teams)<br>{<br>    Console.WriteLine(&quot;Team Name: &quot; + obj.teamName);<br>    Console.WriteLine(&quot;Rank: &quot; + obj.rank.standing);<br>    Console.WriteLine(&quot;Point: &quot; + obj.points.pts);<br>    Console.WriteLine(&quot;1. Driver Name: &quot; + obj.drivers[0].firstname);<br>    Console.WriteLine(&quot;2. Driver Name: &quot; + obj.drivers[1].firstname);<br>    Console.WriteLine(&quot;-------------------&quot;);<br>}</pre><p>Burada gelen jsonu DeserializeObject yapıyorum ve Rootobject sınıfımı kullanıyorum, sonra ise foreach ile dönüp yazdırıyorum. Program çalıştırılmaya hazır.</p><p><strong>RUN!</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/953/1*onXuSGn1hDG2F0XFcme3mg.jpeg" /></figure><p>Görüldüğü üzere bütün verilerimiz gelmiş durumda. Rank ve Pointin 0 olmasının sebebi Sezon bittiği için olabilir diye düşünüyorum.</p><p>Yazımı buraya kadar okuduğunuz için Teşekkür ederim, Umarım beğenmişsinizdir :)</p><p>Proje Github: <a href="https://github.com/mas963/FormulaOneRapidApiConsole">https://github.com/mas963/FormulaOneRapidApiConsole</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=d2000ae39518" width="1" height="1" alt="">]]></content:encoded>
        </item>
    </channel>
</rss>