<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>C-Sharp on SoftDevPractice</title>
    <link>https://softdevpractice.com/tags/c-sharp/</link>
    <description>Recent content in C-Sharp on SoftDevPractice</description>
    <generator>Hugo -- 0.147.3</generator>
    <language>en</language>
    <lastBuildDate>Sun, 24 Nov 2019 13:16:58 +0000</lastBuildDate>
    <atom:link href="https://softdevpractice.com/tags/c-sharp/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>How to handle Many-To-Many in Entity Framework Core</title>
      <link>https://softdevpractice.com/posts/many-to-many-ef-core/</link>
      <pubDate>Sun, 24 Nov 2019 13:16:58 +0000</pubDate><author>Zbigniew</author>
      <guid>https://softdevpractice.com/posts/many-to-many-ef-core/</guid>
      <description>Learn how to handle many-to-many relationships in Entity Framework Core. Includes snippets for database structure creation, inserting &amp;amp; deleteing entities.</description>
      <content:encoded><![CDATA[<p>Many-To-Many relationship in not as straightforward as other relationships. In this post I’ll show you how to create many-to-many relationships and how to use them in EF Core.</p>
<h2 id="the-model">The model</h2>
<p>Simple and practical example of many-to-many could be some sort of digital ecommerce store. Users can put items into shopping cart (one shopping cart can have many items), whereas items belong to multiple carts. Lets start off by creating <code>Cart</code> and <code>Item</code> classes.</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-c#" data-lang="c#"><span class="line"><span class="cl"><span class="kd">public</span> <span class="k">class</span> <span class="nc">Cart</span>
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="kd">public</span> <span class="kt">int</span> <span class="n">Id</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="kd">public</span> <span class="n">ICollection</span><span class="p">&lt;</span><span class="n">Item</span><span class="p">&gt;</span> <span class="n">Items</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></td></tr></table>
</div>
</div><div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-c#" data-lang="c#"><span class="line"><span class="cl"><span class="kd">public</span> <span class="k">class</span> <span class="nc">Item</span>
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="kd">public</span> <span class="kt">int</span> <span class="n">Id</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="kd">public</span> <span class="kt">string</span> <span class="n">Name</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="kd">public</span> <span class="kt">int</span> <span class="n">Quantity</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="kd">public</span> <span class="n">ICollection</span><span class="p">&lt;</span><span class="n">Cart</span><span class="p">&gt;</span> <span class="n">Carts</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>This looks good, but unfortunately it won’t work. At the day of publishing this article EF Core cannot handle this scenario. It simple don’t know how to handle this relationship. This is what you get when you’ll try to add migration:</p>
<blockquote>
<p>Unable to determine the relationship represented by navigation property &lsquo;Cart.Items&rsquo; of type &lsquo;ICollection&lt;Item&gt;&rsquo;. Either manually configure the relationship, or ignore this property using the &lsquo;[NotMapped]&rsquo; attribute or by using &lsquo;EntityTypeBuilder.Ignore&rsquo; in &lsquo;OnModelCreating&rsquo;.</p></blockquote>
<p>First thing we need to do is to manually create another “in-between” class (table) which will hold many-to-many relations. Lets we proceed we new class:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span><span class="lnt">8
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-c#" data-lang="c#"><span class="line"><span class="cl"><span class="kd">public</span> <span class="k">class</span> <span class="nc">CartItem</span>
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="kd">public</span> <span class="kt">int</span> <span class="n">CartId</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="kd">public</span> <span class="n">Cart</span> <span class="n">Cart</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="kd">public</span> <span class="kt">int</span> <span class="n">ItemId</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="kd">public</span> <span class="n">Item</span> <span class="n">Item</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>Since we have a new class that maps <code>Cart</code> to <code>Item</code> we also need to change navigation properties:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-c#" data-lang="c#"><span class="line"><span class="cl"><span class="kd">public</span> <span class="k">class</span> <span class="nc">Cart</span>
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="kd">public</span> <span class="kt">int</span> <span class="n">Id</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="kd">public</span> <span class="n">ICollection</span><span class="p">&lt;</span><span class="n">CartItem</span><span class="p">&gt;</span> <span class="n">Items</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></td></tr></table>
</div>
</div><div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-c#" data-lang="c#"><span class="line"><span class="cl"><span class="kd">public</span> <span class="k">class</span> <span class="nc">Item</span>
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="kd">public</span> <span class="kt">int</span> <span class="n">Id</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="kd">public</span> <span class="kt">string</span> <span class="n">Name</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="kd">public</span> <span class="kt">int</span> <span class="n">Quantity</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="kd">public</span> <span class="n">ICollection</span><span class="p">&lt;</span><span class="n">CartItem</span><span class="p">&gt;</span> <span class="n">Carts</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>If you try to add-migration right now then you’ll get another error:</p>
<blockquote>
<p>The entity type &lsquo;CartItem&rsquo; requires a primary key to be defined.</p></blockquote>
<p>Right, <code>CartItem</code> doesn’t have primary key. Since it’s a many-to-many relationship it should have composite key. Composite key is like a regular primary key but it is composed by two properties (columns) instead of one. At the moment, the only way to create composite key is to define it inside <code>OnModelCreating</code>.</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-c#" data-lang="c#"><span class="line"><span class="cl"><span class="kd">protected</span> <span class="kd">override</span> <span class="k">void</span> <span class="n">OnModelCreating</span><span class="p">(</span><span class="n">ModelBuilder</span> <span class="n">builder</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">base</span><span class="p">.</span><span class="n">OnModelCreating</span><span class="p">(</span><span class="n">builder</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="n">builder</span><span class="p">.</span><span class="n">Entity</span><span class="p">&lt;</span><span class="n">CartItem</span><span class="p">&gt;().</span><span class="n">HasKey</span><span class="p">(</span><span class="n">i</span> <span class="p">=&gt;</span> <span class="k">new</span> <span class="p">{</span> <span class="n">i</span><span class="p">.</span><span class="n">CartId</span><span class="p">,</span> <span class="n">i</span><span class="p">.</span><span class="n">ItemId</span> <span class="p">});</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>Finally, our database structure can be handled by EntityFramework. We can proceed with migration.</p>
<h2 id="inserting-into-many-to-many">Inserting into Many-To-Many</h2>
<p>Suppose that we already have <code>Cart</code> and <code>Item</code> in our database. Now we want to add specific item to specific cart. In order to do this we need to create new <code>CartItem</code> and save it.</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-c#" data-lang="c#"><span class="line"><span class="cl"><span class="kt">var</span> <span class="n">cart</span> <span class="p">=</span> <span class="n">db</span><span class="p">.</span><span class="n">Carts</span><span class="p">.</span><span class="n">First</span><span class="p">(</span><span class="n">i</span> <span class="p">=&gt;</span> <span class="n">i</span><span class="p">.</span><span class="n">Id</span> <span class="p">==</span> <span class="m">256</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="kt">var</span> <span class="n">item</span> <span class="p">=</span> <span class="n">db</span><span class="p">.</span><span class="n">Items</span><span class="p">.</span><span class="n">First</span><span class="p">(</span><span class="n">i</span> <span class="p">=&gt;</span> <span class="n">i</span><span class="p">.</span><span class="n">Id</span> <span class="p">==</span> <span class="m">1024</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// you can either associate it using ids</span>
</span></span><span class="line"><span class="cl"><span class="kt">var</span> <span class="n">cartItem</span> <span class="p">=</span> <span class="k">new</span> <span class="n">CartItem</span>
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="n">CartId</span> <span class="p">=</span> <span class="n">cart</span><span class="p">.</span><span class="n">Id</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="n">ItemId</span> <span class="p">=</span> <span class="n">item</span><span class="p">.</span><span class="n">Id</span>
</span></span><span class="line"><span class="cl"><span class="p">};</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// or by using entities</span>
</span></span><span class="line"><span class="cl"><span class="kt">var</span> <span class="n">cartItem</span> <span class="p">=</span> <span class="k">new</span> <span class="n">CartItem</span>
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="n">Cart</span> <span class="p">=</span> <span class="n">cart</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="n">Item</span> <span class="p">=</span> <span class="n">item</span>
</span></span><span class="line"><span class="cl"><span class="p">};</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">db</span><span class="p">.</span><span class="n">Add</span><span class="p">(</span><span class="n">cartItem</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="n">db</span><span class="p">.</span><span class="n">SaveChanges</span><span class="p">();</span>
</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="retrieving-related-data-in-many-to-many">Retrieving related data in Many-To-Many</h2>
<p>Fetching data from database is rather simple. You need to pay attention to includes in case of retrieving entities with related data. Just remember that there are a total of 3 tables involved: <code>Cart</code>, <code>Item</code>, and <code>CartItem</code> which links items with carts.</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-c#" data-lang="c#"><span class="line"><span class="cl"><span class="c1">// get specific cart including all items</span>
</span></span><span class="line"><span class="cl"><span class="kt">var</span> <span class="n">cartIncludingItems</span> <span class="p">=</span> <span class="n">db</span><span class="p">.</span><span class="n">Carts</span><span class="p">.</span><span class="n">Include</span><span class="p">(</span><span class="n">cart</span> <span class="p">=&gt;</span> <span class="n">cart</span><span class="p">.</span><span class="n">Items</span><span class="p">).</span><span class="n">ThenInclude</span><span class="p">(</span><span class="n">row</span> <span class="p">=&gt;</span> <span class="n">row</span><span class="p">.</span><span class="n">Item</span><span class="p">).</span><span class="n">First</span><span class="p">(</span><span class="n">cart</span> <span class="p">=&gt;</span> <span class="n">cart</span><span class="p">.</span><span class="n">Id</span> <span class="p">==</span> <span class="m">1</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="c1">// get all items belonging to cart</span>
</span></span><span class="line"><span class="cl"><span class="kt">var</span> <span class="n">cartItems</span> <span class="p">=</span> <span class="n">cartIncludingItems</span><span class="p">.</span><span class="n">Items</span><span class="p">.</span><span class="n">Select</span><span class="p">(</span><span class="n">row</span> <span class="p">=&gt;</span> <span class="n">row</span><span class="p">.</span><span class="n">Item</span><span class="p">);</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>In addition, you don’t have to do it using a relation. For instance, if you have cart id you can fetch all items at once using following Linq:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-c#" data-lang="c#"><span class="line"><span class="cl"><span class="kt">var</span> <span class="n">cartId</span> <span class="p">=</span> <span class="m">1</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="kt">var</span> <span class="n">cartItems</span> <span class="p">=</span> <span class="n">db</span><span class="p">.</span><span class="n">Items</span><span class="p">.</span><span class="n">Where</span><span class="p">(</span><span class="n">item</span> <span class="p">=&gt;</span> <span class="n">item</span><span class="p">.</span><span class="n">Carts</span><span class="p">.</span><span class="n">Any</span><span class="p">(</span><span class="n">j</span> <span class="p">=&gt;</span> <span class="n">j</span><span class="p">.</span><span class="n">CartId</span> <span class="p">==</span> <span class="n">cartId</span><span class="p">));</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>Same principle applies to opposite use case, which means that you can apply above pattern to get all carts which have specific item.</p>
<h2 id="deleting-from-many-to-many">Deleting from Many-To-Many</h2>
<p>By deleting we mean removing association between cart and item. We won’t remove the cart or the item in the following examples, just the thing which holds cart and item association.</p>
<p>Lets start by deleting single item from cart.</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-c#" data-lang="c#"><span class="line"><span class="cl"><span class="kt">var</span> <span class="n">cartId</span> <span class="p">=</span> <span class="m">1</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="kt">var</span> <span class="n">itemId</span> <span class="p">=</span> <span class="m">1</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="kt">var</span> <span class="n">cartItem</span> <span class="p">=</span> <span class="n">db</span><span class="p">.</span><span class="n">CartsItems</span><span class="p">.</span><span class="n">First</span><span class="p">(</span><span class="n">row</span> <span class="p">=&gt;</span> <span class="n">row</span><span class="p">.</span><span class="n">CartId</span> <span class="p">==</span> <span class="n">cartId</span> <span class="p">&amp;&amp;</span> <span class="n">row</span><span class="p">.</span><span class="n">ItemId</span> <span class="p">==</span> <span class="n">itemId</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">db</span><span class="p">.</span><span class="n">Remove</span><span class="p">(</span><span class="n">cartItem</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="n">db</span><span class="p">.</span><span class="n">SaveChanges</span><span class="p">();</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>Then, let me show you how to remove all items from a cart.</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-c#" data-lang="c#"><span class="line"><span class="cl"><span class="kt">var</span> <span class="n">cart</span> <span class="p">=</span> <span class="n">db</span><span class="p">.</span><span class="n">Carts</span><span class="p">.</span><span class="n">Include</span><span class="p">(</span><span class="n">c</span><span class="p">=&gt;</span> <span class="n">c</span><span class="p">.</span><span class="n">Items</span><span class="p">).</span><span class="n">First</span><span class="p">(</span><span class="n">i</span> <span class="p">=&gt;</span> <span class="n">i</span><span class="p">.</span><span class="n">Id</span> <span class="p">==</span> <span class="m">2</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">db</span><span class="p">.</span><span class="n">RemoveRange</span><span class="p">(</span><span class="n">cart</span><span class="p">.</span><span class="n">Items</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="n">db</span><span class="p">.</span><span class="n">SaveChanges</span><span class="p">();</span>
</span></span></code></pre></td></tr></table>
</div>
</div>]]></content:encoded>
    </item>
    <item>
      <title>Enumerable.Range by example</title>
      <link>https://softdevpractice.com/posts/enumerable-range-by-example/</link>
      <pubDate>Thu, 31 Oct 2019 17:13:18 +0000</pubDate><author>Zbigniew</author>
      <guid>https://softdevpractice.com/posts/enumerable-range-by-example/</guid>
      <description>Learn about Enumerable.Range and its use cases including reversing a sequence or modifying it with LINQ. Learn who to create custom sequence generator.</description>
      <content:encoded><![CDATA[<p>C# Enumerable.Range function generates sequence of numbers. This article explores details of the <code>Range</code> function as well as its use cases.</p>
<h2 id="enumerablerange-overview">Enumerable.Range overview</h2>
<p>It takes two arguments. First argument is the first number in sequence (e.g. 10, means that the first number in sequence is 10). Second argument is the number of items in sequence (e.g. 11 means that it will return 11 numbers).</p>
<p>It returns <code>IEnumerable&lt;int&gt;</code> which contains generated sequence. Keep in mind that each subsequent number is incremented by 1, which also means that it’s in ascending order. This however can be changed with some Linq tricks (check examples below).</p>
<p><code>Range</code> function works only with integral numbers, but with the help of Linq we can make it work with floats.</p>
<h2 id="basic-example">Basic example</h2>
<p>Lets start with basic example. We’re going to print numbers 9 to 99.</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-c#" data-lang="c#"><span class="line"><span class="cl"><span class="c1">// print 91 numbers, 9 being the first number</span>
</span></span><span class="line"><span class="cl"><span class="k">foreach</span><span class="p">(</span><span class="kt">var</span> <span class="n">number</span> <span class="k">in</span> <span class="n">Enumerable</span><span class="p">.</span><span class="n">Range</span><span class="p">(</span><span class="m">9</span><span class="p">,</span> <span class="m">91</span><span class="p">))</span>
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="n">Console</span><span class="p">.</span><span class="n">WriteLine</span><span class="p">(</span><span class="n">number</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="reversing-sequence-descending-order">Reversing sequence, descending order</h2>
<p>Linq makes reversing the sequence very easy. All you need to do is to use Reverse method. Check out following example, which prints number 10 to 1.</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-c#" data-lang="c#"><span class="line"><span class="cl"><span class="c1">// generate sequence of numbers from 1 to 10</span>
</span></span><span class="line"><span class="cl"><span class="c1">// then reverse it</span>
</span></span><span class="line"><span class="cl"><span class="k">foreach</span><span class="p">(</span><span class="kt">var</span> <span class="n">number</span> <span class="k">in</span> <span class="n">Enumerable</span><span class="p">.</span><span class="n">Range</span><span class="p">(</span><span class="m">1</span><span class="p">,</span> <span class="m">10</span><span class="p">).</span><span class="n">Reverse</span><span class="p">())</span>
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="n">Console</span><span class="p">.</span><span class="n">WriteLine</span><span class="p">(</span><span class="n">number</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="generating-sequence-of-even-or-odd-numbers-only">Generating sequence of even (or odd) numbers only</h2>
<p>This turns out to be pretty easy with modulo and Linq. However, there is a caveat. Code below won’t generate 100 numbers. It is because we firstly generate numbers 1 to 100 then we select only numbers which match criteria (even or odd), which basically halves amount of numbers.</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-c#" data-lang="c#"><span class="line"><span class="cl"><span class="kt">var</span> <span class="n">even</span> <span class="p">=</span>  <span class="n">Enumerable</span><span class="p">.</span><span class="n">Range</span><span class="p">(</span><span class="m">1</span><span class="p">,</span> <span class="m">100</span><span class="p">).</span><span class="n">Where</span><span class="p">(</span><span class="n">number</span> <span class="p">=&gt;</span> <span class="n">number</span> <span class="p">%</span> <span class="m">2</span> <span class="p">==</span> <span class="m">0</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="kt">var</span> <span class="n">odd</span> <span class="p">=</span>  <span class="n">Enumerable</span><span class="p">.</span><span class="n">Range</span><span class="p">(</span><span class="m">1</span><span class="p">,</span> <span class="m">100</span><span class="p">).</span><span class="n">Where</span><span class="p">(</span><span class="n">number</span> <span class="p">=&gt;</span> <span class="n">number</span> <span class="p">%</span> <span class="m">2</span> <span class="p">==</span> <span class="m">1</span><span class="p">);</span>
</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="negative-numbers">Negative numbers</h2>
<p>Suppose you want to generate sequence of numbers from -1 to -10. The easiest way to do it (at least in terms of Enumerable.Range) is to generate sequence from 1 to 10 and turn each number to negative number.</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-c#" data-lang="c#"><span class="line"><span class="cl"><span class="kt">var</span> <span class="n">numbers</span> <span class="p">=</span>  <span class="n">Enumerable</span><span class="p">.</span><span class="n">Range</span><span class="p">(</span><span class="m">1</span><span class="p">,</span> <span class="m">10</span><span class="p">).</span><span class="n">Select</span><span class="p">(</span><span class="n">number</span> <span class="p">=&gt;</span> <span class="p">-</span><span class="n">number</span><span class="p">);</span>
</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="increment-or-decrement-by-any-number">Increment (or decrement) by any number</h2>
<p>Suppose that you want your sequence step to be 2 instead on 1. For example you want 1, 3, 5, 7, 9 instead of 1, 2, 3, 4, 5.</p>
<p>The tricks is to multiple each number by 2 and then substract 2 from it.</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-c#" data-lang="c#"><span class="line"><span class="cl"><span class="kt">var</span> <span class="n">numbers</span> <span class="p">=</span>  <span class="n">Enumerable</span><span class="p">.</span><span class="n">Range</span><span class="p">(</span><span class="m">1</span><span class="p">,</span> <span class="m">5</span><span class="p">).</span><span class="n">Select</span><span class="p">(</span><span class="n">number</span> <span class="p">=&gt;</span> <span class="n">number</span> <span class="p">*</span> <span class="m">2</span> <span class="p">-</span> <span class="m">2</span><span class="p">);</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>If you need your numbers to alter by 3 (or any other number) then you have to replace 2 with 3.</p>
<h2 id="working-with-floats">Working with floats</h2>
<p><code>Enumerable.Range</code> doesn’t work with floats. As you’ve seen in previous use cases it generates only integer values. Unless you use Linq, but it has a drawback. It hard to read, in addition you have to think twice before you (or someone else reading your code) figure it out. With that being said, lets take a look at the example.</p>
<p>Following snippet generates sequence of numbers from 1 to 2 with step 0.1.</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-c#" data-lang="c#"><span class="line"><span class="cl"><span class="kt">var</span> <span class="n">numbers</span> <span class="p">=</span>  <span class="n">Enumerable</span><span class="p">.</span><span class="n">Range</span><span class="p">(</span><span class="m">10</span><span class="p">,</span> <span class="m">10</span><span class="p">).</span><span class="n">Select</span><span class="p">(</span><span class="n">number</span> <span class="p">=&gt;</span> <span class="n">number</span> <span class="p">/</span> <span class="m">10f</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="c1">// for each number in sequence 10, 11, 12, ..., 20</span>
</span></span><span class="line"><span class="cl"><span class="c1">// divide it by 10</span>
</span></span><span class="line"><span class="cl"><span class="c1">// which results in sequence 1.0, 1.1, 1.2, ..., 2.0</span>
</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="custom-sequence-generator">Custom sequence generator</h2>
<p>You’ve probably noticed that some examples are a little bit far fetched. <code>Enumerable.Range</code> works well for simple scenarios. However advanced use cases are hard to read and result in additional Linq overhead. Fortunately we can easily create our own custom sequence generators.</p>
<p>You can use following technique to rewrite every example in this post. I won’t go into details, so it’s up to you to figure it out, but let me just show you how you can rewrite the even numbers generator.</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span><span class="lnt">27
</span><span class="lnt">28
</span><span class="lnt">29
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-c#" data-lang="c#"><span class="line"><span class="cl"><span class="kd">public</span> <span class="kd">static</span> <span class="k">class</span> <span class="nc">Sequences</span>
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="kd">public</span> <span class="kd">static</span> <span class="n">IEnumerable</span><span class="p">&lt;</span><span class="kt">float</span><span class="p">&gt;</span> <span class="n">Even</span><span class="p">(</span><span class="kt">int</span> <span class="n">start</span><span class="p">,</span> <span class="kt">int</span> <span class="n">count</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="c1">// validation skipped e.g. count should always be more than 0</span>
</span></span><span class="line"><span class="cl">        <span class="c1">// I&#39;ll leave it as an exercise for you</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="c1">// if start is odd number then increment it</span>
</span></span><span class="line"><span class="cl">        <span class="c1">// so the first number is always even</span>
</span></span><span class="line"><span class="cl">        <span class="k">if</span> <span class="p">(</span><span class="n">start</span> <span class="p">%</span> <span class="m">2</span> <span class="p">==</span> <span class="m">1</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="p">{</span>
</span></span><span class="line"><span class="cl">            <span class="n">start</span><span class="p">++;</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="kt">int</span> <span class="n">counter</span> <span class="p">=</span> <span class="m">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">        <span class="k">while</span> <span class="p">(</span><span class="n">counter</span> <span class="p">&lt;</span> <span class="n">count</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="p">{</span>
</span></span><span class="line"><span class="cl">            <span class="k">yield</span> <span class="k">return</span> <span class="n">start</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">            <span class="n">counter</span><span class="p">++;</span>
</span></span><span class="line"><span class="cl">            <span class="n">start</span> <span class="p">+=</span> <span class="m">2</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// usage - get 10 even numbers starting with 2</span>
</span></span><span class="line"><span class="cl"><span class="k">foreach</span> <span class="p">(</span><span class="kt">var</span> <span class="n">number</span> <span class="k">in</span> <span class="n">Sequences</span><span class="p">.</span><span class="n">Even</span><span class="p">(</span><span class="m">2</span><span class="p">,</span> <span class="m">10</span><span class="p">))</span>
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="c1">// some action</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></td></tr></table>
</div>
</div>]]></content:encoded>
    </item>
    <item>
      <title>ASP.NET Core/Razor Pages localize nested classes</title>
      <link>https://softdevpractice.com/posts/localize-nested-classes/</link>
      <pubDate>Sun, 22 Sep 2019 10:34:23 +0000</pubDate><author>Zbigniew</author>
      <guid>https://softdevpractice.com/posts/localize-nested-classes/</guid>
      <description>Learn how to localize nested classes in ASP.NET Core and Razor Pages.</description>
      <content:encoded><![CDATA[<p>You probably already know how to localize regular classes in ASP.NET Core web app. It’s rather easy, at least in terms of resource files. Sometimes however we use nested classes which requires special way of naming RESX files. As it turns out it is actually pretty easy to do.</p>
<p>If you want the answer right away, then here it is. You have to use <code>+</code> sign in the name of your resource file (like this: <code>OuterClass+NestedClass.en.resx</code>).</p>
<h2 id="localizing-with-resource-files">Localizing with resource files</h2>
<p>Both Razor Pages and ASP.NET Core have built-in support for localization using resource files (RESX). Each resource file is basically an XML file. It contains keys (string to be localized), values (localized values) and optional comments. We access translations by using instances of <code>IStringLocalizer</code> (or <code>IViewLocalizer</code> for views) which lets us get localized strings by using indexers.</p>
<p>Resource files has to be named after class or view file. In addition it has to be put in directory structure which reflects namespace of localized file. Each language has to have its own RESX file, and the language code has to be a part of its file name. If you want to know more about it please refer to the official documentation located <a href="https://docs.microsoft.com/pl-pl/aspnet/core/fundamentals/localization">here</a>.</p>
<p><img alt="RESX file name for AccountController class and english culture." loading="lazy" src="/img/ClassName.png" title="RESX file name for AccountController class and english culture."></p>
<p>Let me show you and example of how it works. We’ll start with a controller, notice the <code>IStringLocalizer</code> instance (<code>_localizer</code>)and how we can use it to access localization.</p>
<p><img alt="Localization in controller." loading="lazy" src="/img/localization-account-controller.png" title="Localization in controller."></p>
<p>Now, take a look at the directory structure.</p>
<p><img alt="Localization directory structure." loading="lazy" src="/img/localization-directory-structure.png" title="Localization directory structure."></p>
<h2 id="nested-classes">Nested classes</h2>
<p>Sometimes we want to create nested classes. There are various reasons you may want to do that. Personally, I do that for view models when I want to group chunk of common data or when I want to create a list of items because it’s used only at that place.</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-c#" data-lang="c#"><span class="line"><span class="cl"><span class="c1">// Example nested class</span>
</span></span><span class="line"><span class="cl"><span class="kd">public</span> <span class="k">class</span> <span class="nc">ListViewModel</span>
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="kd">public</span> <span class="kt">string</span> <span class="n">SomeVariable</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="kd">public</span> <span class="n">List</span><span class="p">&lt;</span><span class="n">ListItem</span><span class="p">&gt;</span> <span class="n">Items</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="kd">public</span> <span class="k">class</span> <span class="nc">ListItem</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="kd">public</span> <span class="kt">int</span> <span class="n">Id</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="kd">public</span> <span class="kt">string</span> <span class="n">Name</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>So, how do we localize nested class in the example above? It pretty simple, we need to name RESX file in special way. Firstly, we include class name, then goes the plus sign and then goes the nested class name. That’s how reflection “sees” nested classes (outer class name, plus sign, inner class name).</p>
<p><img alt="RESX file name for nested class." loading="lazy" src="/img/RESX-localization-nested-class.png" title="RESX file name for nested class."></p>
]]></content:encoded>
    </item>
    <item>
      <title>Iterate dictionary in C#</title>
      <link>https://softdevpractice.com/posts/iterate-dictionary-in-c/</link>
      <pubDate>Sun, 25 Aug 2019 12:56:15 +0000</pubDate><author>Zbigniew</author>
      <guid>https://softdevpractice.com/posts/iterate-dictionary-in-c/</guid>
      <description>Learn how to iterate over Dictionary entries.</description>
      <content:encoded><![CDATA[<p>This time I’m going to give a few quick tips for dictionaries in C#.</p>
<p>Some basic points before we begin:</p>
<ul>
<li>Dictionary is an unordered data structure</li>
<li>Dictionary maps keys to values</li>
<li>Keys have to be unique</li>
<li>Dictionary implements IEnumerable</li>
</ul>
<p>Let’s start by creating a simple dictionary with some data:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-c#" data-lang="c#"><span class="line"><span class="cl"><span class="c1">// e.g. name and birth date</span>
</span></span><span class="line"><span class="cl"><span class="kt">var</span> <span class="n">people</span> <span class="p">=</span> <span class="k">new</span> <span class="n">Dictionary</span><span class="p">&lt;</span><span class="kt">string</span><span class="p">,</span> <span class="n">DateTime</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span> <span class="s">&#34;John&#34;</span><span class="p">,</span> <span class="k">new</span> <span class="n">DateTime</span><span class="p">(</span><span class="m">2000</span><span class="p">,</span> <span class="m">1</span><span class="p">,</span> <span class="m">1</span><span class="p">)</span> <span class="p">},</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span> <span class="s">&#34;Jane&#34;</span><span class="p">,</span> <span class="k">new</span> <span class="n">DateTime</span><span class="p">(</span><span class="m">2000</span><span class="p">,</span> <span class="m">1</span><span class="p">,</span> <span class="m">2</span><span class="p">)</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">};</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>Looping through dictionary is simple, since it implements IEnumerable all we have to do is to use foreach loop. Each dictionary item has Key and Value property:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-c#" data-lang="c#"><span class="line"><span class="cl"><span class="k">foreach</span> <span class="p">(</span><span class="kt">var</span> <span class="n">person</span> <span class="k">in</span> <span class="n">people</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="n">Console</span><span class="p">.</span><span class="n">WriteLine</span><span class="p">(</span><span class="s">$&#34;Name: {person.Key} Birth: {person.Value}&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>Also, remember that dictionary is unordered, which means that you cannot expect it to return values in the same order every time. So when you loop it one more time it can print values in different order.</p>
<p>We iterated through dictionary entries, but we can also iterate throught dictionary Keys or Values only:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span><span class="lnt">8
</span><span class="lnt">9
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-c#" data-lang="c#"><span class="line"><span class="cl"><span class="k">foreach</span> <span class="p">(</span><span class="kt">var</span> <span class="n">name</span> <span class="k">in</span> <span class="n">people</span><span class="p">.</span><span class="n">Keys</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="n">Console</span><span class="p">.</span><span class="n">WriteLine</span><span class="p">(</span><span class="s">$&#34;Name: {name}&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">foreach</span> <span class="p">(</span><span class="kt">var</span> <span class="n">birth</span> <span class="k">in</span> <span class="n">people</span><span class="p">.</span><span class="n">Values</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="n">Console</span><span class="p">.</span><span class="n">WriteLine</span><span class="p">(</span><span class="s">$&#34;Birth: {birth}&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>You can use Linq to filter entries:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-c#" data-lang="c#"><span class="line"><span class="cl"><span class="k">foreach</span> <span class="p">(</span><span class="kt">var</span> <span class="n">person</span> <span class="k">in</span> <span class="n">people</span><span class="p">.</span><span class="n">Where</span><span class="p">(</span><span class="n">i</span> <span class="p">=&gt;</span> <span class="n">i</span><span class="p">.</span><span class="n">Value</span><span class="p">.</span><span class="n">Year</span> <span class="p">&gt;=</span> <span class="m">2000</span><span class="p">))</span>
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="n">Console</span><span class="p">.</span><span class="n">WriteLine</span><span class="p">(</span><span class="s">$&#34;Name: {person.Key} Birth: {person.Value}&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>Or you can transform/project it to some other data structures:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-c#" data-lang="c#"><span class="line"><span class="cl"><span class="k">foreach</span> <span class="p">(</span><span class="kt">var</span> <span class="n">username</span> <span class="k">in</span> <span class="n">people</span><span class="p">.</span><span class="n">Select</span><span class="p">(</span><span class="n">i</span> <span class="p">=&gt;</span> <span class="s">$&#34;{i.Key}{i.Value.Year}&#34;</span><span class="p">))</span>
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="n">Console</span><span class="p">.</span><span class="n">WriteLine</span><span class="p">(</span><span class="s">$&#34;Username : {username}&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>That’s it.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Where() Select()</title>
      <link>https://softdevpractice.com/posts/where-select/</link>
      <pubDate>Sun, 28 Jul 2019 13:07:33 +0000</pubDate><author>Zbigniew</author>
      <guid>https://softdevpractice.com/posts/where-select/</guid>
      <description>A few tips of what can be done with Where and Select in Linq.</description>
      <content:encoded><![CDATA[<p>This post is quick intro for beginners. I’ll introduce you to 2 Linq methods Select and Where. We use those functions to manipulate data set.</p>
<p>All 2 can be applied to all types implementing IEnumerable interface. It means that you can apply them to data retrieved from database (<code>IQueryable</code>), list (<code>List</code>/<code>IList</code> implements <code>IEnumerable</code>), arrays (which also implements <code>IEnumerable</code>) and others.</p>
<p>It’s important to know that each one of those functions return new IEnumerable. Even if we execute these methods on array (e.g. <code>int[]</code>) it returns enumerable (e.g. <code>IEnumerable&lt;int&gt;</code>). Note that it works a bit different for <code>IQueryable</code> and database operations. Since this is an introductory level post I’ll show you how to use them using array based examples.</p>
<h2 id="select">Select()</h2>
<p>With Select we can map/project data to new form. It means that we can use it make something with every element.</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-c#" data-lang="c#"><span class="line"><span class="cl"><span class="p">&gt;</span><span class="kt">var</span> <span class="n">numbers</span> <span class="p">=</span> <span class="k">new</span> <span class="p">[]</span> <span class="p">{</span> <span class="m">1</span><span class="p">,</span> <span class="m">2</span><span class="p">,</span> <span class="m">3</span><span class="p">,</span> <span class="m">4</span><span class="p">,</span> <span class="m">5</span> <span class="p">};</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// take each number and multiply it by itself</span>
</span></span><span class="line"><span class="cl"><span class="kt">var</span> <span class="n">newNumbers</span> <span class="p">=</span> <span class="n">numbers</span><span class="p">.</span><span class="n">Select</span><span class="p">(</span><span class="n">number</span> <span class="p">=&gt;</span> <span class="n">number</span> <span class="p">*</span> <span class="n">number</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// take each number and put it into a string</span>
</span></span><span class="line"><span class="cl"><span class="kt">var</span> <span class="n">numberMessages</span> <span class="p">=</span> <span class="n">numbers</span><span class="p">.</span><span class="n">Select</span><span class="p">(</span><span class="n">number</span> <span class="p">=&gt;</span> <span class="s">$&#34;I say {number}&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// take each number and put it into new class</span>
</span></span><span class="line"><span class="cl"><span class="kt">var</span> <span class="n">people</span> <span class="p">=</span> <span class="n">numbers</span><span class="p">.</span><span class="n">Select</span><span class="p">(</span><span class="n">number</span> <span class="p">=&gt;</span> <span class="k">new</span> <span class="n">Person</span> <span class="p">{</span> <span class="n">Id</span> <span class="p">=</span> <span class="n">number</span> <span class="p">});</span>
</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="where">Where()</h2>
<p>We use Where when we want to filter data. So it checks every element and returns only elements which matches critera.</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span><span class="lnt">8
</span><span class="lnt">9
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-c#" data-lang="c#"><span class="line"><span class="cl"><span class="kt">var</span> <span class="n">numbers</span> <span class="p">=</span> <span class="k">new</span> <span class="p">[]</span> <span class="p">{</span> <span class="m">1</span><span class="p">,</span> <span class="m">2</span><span class="p">,</span> <span class="m">3</span><span class="p">,</span> <span class="m">4</span><span class="p">,</span> <span class="m">5</span> <span class="p">};</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// take each number make sure it&#39;s an odd number</span>
</span></span><span class="line"><span class="cl"><span class="kt">var</span> <span class="n">oddNumbers</span> <span class="p">=</span> <span class="n">numbers</span><span class="p">.</span><span class="n">Where</span><span class="p">(</span><span class="n">number</span> <span class="p">=&gt;</span> <span class="n">number</span> <span class="p">%</span> <span class="m">2</span> <span class="p">==</span> <span class="m">1</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kt">var</span> <span class="n">names</span> <span class="p">=</span> <span class="k">new</span> <span class="p">[]</span> <span class="p">{</span> <span class="s">&#34;Adam&#34;</span><span class="p">,</span> <span class="s">&#34;Eve&#34;</span> <span class="p">};</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// take each name and find only the ones that start with and &#34;A&#34;</span>
</span></span><span class="line"><span class="cl"><span class="kt">var</span> <span class="n">foundNames</span> <span class="p">=</span> <span class="n">names</span><span class="p">.</span><span class="n">Where</span><span class="p">(</span><span class="n">name</span> <span class="p">=&gt;</span> <span class="n">name</span><span class="p">.</span><span class="n">StartsWith</span><span class="p">(</span><span class="s">&#34;A&#34;</span><span class="p">));</span>
</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="chaining-select-and-where">Chaining Select and Where</h2>
<p>Since both of these functions return IEnumerable we can chain them. Take a look at this example:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-c#" data-lang="c#"><span class="line"><span class="cl"><span class="kt">var</span> <span class="n">names</span> <span class="p">=</span> <span class="k">new</span> <span class="p">[]</span> <span class="p">{</span> <span class="s">&#34;Adam&#34;</span><span class="p">,</span> <span class="s">&#34;Amy&#34;</span><span class="p">,</span> <span class="s">&#34;Eve&#34;</span> <span class="p">};</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// take each name and find only the ones that start with and &#34;A&#34;</span>
</span></span><span class="line"><span class="cl"><span class="c1">// then create an sentence with given name</span>
</span></span><span class="line"><span class="cl"><span class="kt">var</span> <span class="n">foundNames</span> <span class="p">=</span> <span class="n">names</span><span class="p">.</span><span class="n">Where</span><span class="p">(</span><span class="n">name</span> <span class="p">=&gt;</span> <span class="n">name</span><span class="p">.</span><span class="n">StartsWith</span><span class="p">(</span><span class="s">&#34;A&#34;</span><span class="p">)).</span><span class="n">Select</span><span class="p">(</span><span class="n">name</span> <span class="p">=&gt;</span> <span class="s">$&#34;My name is {name}&#34;</span><span class="p">);</span>
</span></span></code></pre></td></tr></table>
</div>
</div>]]></content:encoded>
    </item>
    <item>
      <title>ASP.NET Core: extending built-in tag helpers</title>
      <link>https://softdevpractice.com/posts/asp-net-core-extending-built-tag-helpers/</link>
      <pubDate>Fri, 09 Feb 2018 17:10:36 +0000</pubDate><author>Zbigniew</author>
      <guid>https://softdevpractice.com/posts/asp-net-core-extending-built-tag-helpers/</guid>
      <description>&lt;p&gt;In this post I’ll show you how you can extend built-in tag helpers.&lt;/p&gt;
&lt;h2 id=&#34;what-are-tag-helpers&#34;&gt;What are tag helpers?&lt;/h2&gt;
&lt;p&gt;Basically tag helpers are classes which take part in processing (or creating) HTML elements inside Razor views. You can create C# code which will target desired HTML and produce desired output. For more throughtout explanation see &lt;a href=&#34;https://docs.microsoft.com/en-us/aspnet/core/mvc/views/tag-helpers/intro&#34;&gt;Introduction to Tag Helpers in ASP.NET Core&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;setup&#34;&gt;Setup&lt;/h2&gt;
&lt;p&gt;Before we begin, make sure that your setup is correct. If your custom tag helpers are in &lt;code&gt;Solution&lt;/code&gt; assembly then you need to add this line to your &lt;code&gt;View/_ViewImports.cshtml&lt;/code&gt; file:&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>In this post I’ll show you how you can extend built-in tag helpers.</p>
<h2 id="what-are-tag-helpers">What are tag helpers?</h2>
<p>Basically tag helpers are classes which take part in processing (or creating) HTML elements inside Razor views. You can create C# code which will target desired HTML and produce desired output. For more throughtout explanation see <a href="https://docs.microsoft.com/en-us/aspnet/core/mvc/views/tag-helpers/intro">Introduction to Tag Helpers in ASP.NET Core</a></p>
<h2 id="setup">Setup</h2>
<p>Before we begin, make sure that your setup is correct. If your custom tag helpers are in <code>Solution</code> assembly then you need to add this line to your <code>View/_ViewImports.cshtml</code> file:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-c#" data-lang="c#"><span class="line"><span class="cl"><span class="n">@addTagHelper</span> <span class="p">*,</span> <span class="n">Solution</span>
</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="how-to-add-a-html-class-attribute-to-all-img-elements-by-extending-imagetaghelper">How to add a HTML class attribute to all img elements by extending ImageTagHelper.</h2>
<p>If you use Bootstrap you may want to add <a href="https://getbootstrap.com/docs/4.0/content/images/">img-fluid</a> css class to images to automatically make all available images responsive.</p>
<p>We can achieve this by extending <code>ImageTagHelper</code>. Notice that we’re merging attributes, so our tag helper won’t override classes which are already present in the markup.</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-c#" data-lang="c#"><span class="line"><span class="cl"><span class="na">[HtmlTargetElement(&#34;img&#34;, TagStructure = TagStructure.WithoutEndTag)]</span>
</span></span><span class="line"><span class="cl">    <span class="kd">public</span> <span class="k">class</span> <span class="nc">ResponsiveImageTagHelper</span> <span class="p">:</span> <span class="n">ImageTagHelper</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="kd">public</span> <span class="n">ResponsiveImageTagHelper</span><span class="p">(</span><span class="n">IHostingEnvironment</span> <span class="n">hostingEnvironment</span><span class="p">,</span> <span class="n">IMemoryCache</span> <span class="n">cache</span><span class="p">,</span> <span class="n">HtmlEncoder</span> <span class="n">htmlEncoder</span><span class="p">,</span> <span class="n">IUrlHelperFactory</span> <span class="n">urlHelperFactory</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">            <span class="p">:</span> <span class="k">base</span><span class="p">(</span><span class="n">hostingEnvironment</span><span class="p">,</span> <span class="n">cache</span><span class="p">,</span> <span class="n">htmlEncoder</span><span class="p">,</span> <span class="n">urlHelperFactory</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="kd">public</span> <span class="kd">override</span> <span class="k">void</span> <span class="n">Process</span><span class="p">(</span><span class="n">TagHelperContext</span> <span class="n">context</span><span class="p">,</span> <span class="n">TagHelperOutput</span> <span class="n">output</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="p">{</span>
</span></span><span class="line"><span class="cl">            <span class="k">base</span><span class="p">.</span><span class="n">Process</span><span class="p">(</span><span class="n">context</span><span class="p">,</span> <span class="n">output</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">            <span class="kt">var</span> <span class="n">img</span> <span class="p">=</span> <span class="k">new</span> <span class="n">TagBuilder</span><span class="p">(</span><span class="s">&#34;img&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">            <span class="n">img</span><span class="p">.</span><span class="n">Attributes</span><span class="p">.</span><span class="n">Add</span><span class="p">(</span><span class="s">&#34;class&#34;</span><span class="p">,</span> <span class="s">&#34;img-fluid&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">            <span class="n">output</span><span class="p">.</span><span class="n">MergeAttributes</span><span class="p">(</span><span class="n">img</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>Results:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl">// input
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">img</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;border&#34;</span> <span class="na">src</span><span class="o">=</span><span class="s">&#34;image.png&#34;</span> <span class="p">/&gt;</span>
</span></span><span class="line"><span class="cl">// output
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">img</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;border img-fluid&#34;</span> <span class="na">src</span><span class="o">=</span><span class="s">&#34;image.png&#34;</span> <span class="p">/&gt;</span>
</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="how-to-add-required-indicator-to-labels-which-refer-to-required-properties-by-extending-labeltaghelper">How to add required indicator to labels which refer to <code>[Required]</code> properties by extending LabelTagHelper.</h2>
<p>I’ll show you a way to add “(required)” text to all labels which point to properties with <code>Required</code> attribute.</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-c#" data-lang="c#"><span class="line"><span class="cl"><span class="na">[HtmlTargetElement(&#34;label&#34;, Attributes = &#34;asp-for&#34;)]</span>
</span></span><span class="line"><span class="cl">    <span class="kd">public</span> <span class="k">class</span> <span class="nc">LabelRequiredTagHelper</span> <span class="p">:</span> <span class="n">LabelTagHelper</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="kd">public</span> <span class="n">LabelRequiredTagHelper</span><span class="p">(</span><span class="n">IHtmlGenerator</span> <span class="n">htmlGenerator</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">            <span class="p">:</span> <span class="k">base</span><span class="p">(</span><span class="n">htmlGenerator</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="kd">public</span> <span class="kd">override</span> <span class="kd">async</span> <span class="n">Task</span> <span class="n">ProcessAsync</span><span class="p">(</span><span class="n">TagHelperContext</span> <span class="n">context</span><span class="p">,</span> <span class="n">TagHelperOutput</span> <span class="n">output</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="p">{</span>
</span></span><span class="line"><span class="cl">            <span class="k">await</span> <span class="k">base</span><span class="p">.</span><span class="n">ProcessAsync</span><span class="p">(</span><span class="n">context</span><span class="p">,</span> <span class="n">output</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">            <span class="kt">var</span> <span class="n">metadata</span> <span class="p">=</span> <span class="n">For</span><span class="p">.</span><span class="n">Metadata</span> <span class="k">as</span> <span class="n">DefaultModelMetadata</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">            <span class="kt">bool</span> <span class="n">hasRequiredAttribute</span> <span class="p">=</span> <span class="n">metadata</span>
</span></span><span class="line"><span class="cl">                                        <span class="p">?.</span><span class="n">Attributes</span>
</span></span><span class="line"><span class="cl">                                        <span class="p">.</span><span class="n">PropertyAttributes</span>
</span></span><span class="line"><span class="cl">                                        <span class="p">.</span><span class="n">Any</span><span class="p">(</span><span class="n">i</span> <span class="p">=&gt;</span> <span class="n">i</span><span class="p">.</span><span class="n">GetType</span><span class="p">()</span> <span class="p">==</span> <span class="k">typeof</span><span class="p">(</span><span class="n">RequiredAttribute</span><span class="p">))</span> <span class="p">??</span> <span class="kc">false</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">            <span class="k">if</span> <span class="p">(</span><span class="n">hasRequiredAttribute</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">            <span class="p">{</span>
</span></span><span class="line"><span class="cl">                <span class="n">output</span><span class="p">.</span><span class="n">PostContent</span><span class="p">.</span><span class="n">AppendHtml</span><span class="p">(</span><span class="s">&#34;(required)&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">            <span class="p">}</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>Results:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl">// input
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">label</span> <span class="na">asp-for</span><span class="o">=</span><span class="s">&#34;Username&#34;</span><span class="p">&gt;&lt;/</span><span class="nt">label</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">// output
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">label</span> <span class="na">for</span><span class="o">=</span><span class="s">&#34;Username&#34;</span><span class="p">&gt;</span>Username<span class="p">&lt;</span><span class="nt">span</span><span class="p">&gt;</span>(required)<span class="p">&lt;/</span><span class="nt">span</span><span class="p">&gt;&lt;/</span><span class="nt">label</span><span class="p">&gt;</span>
</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="how-to-show-number-of-allowed-characters-next-to-textarea-by-extending-textareataghelper">How to show number of allowed characters next to textarea by extending <code>TextAreaTagHelper</code>.</h2>
<p>Textarea has <code>maxlength</code> attribute, we’re going to display a message which’ll print it out with additional message. Note that we should use <code>MaxLength</code> attribute (from DataAnnotations) to check maximum length of sent data. I’ve ommited this for brevity.</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-c#" data-lang="c#"><span class="line"><span class="cl"><span class="na">[HtmlTargetElement(&#34;textarea&#34;, Attributes = &#34;asp-for&#34;)]</span>
</span></span><span class="line"><span class="cl">    <span class="kd">public</span> <span class="k">class</span> <span class="nc">ExtendedTextareaTagHelper</span> <span class="p">:</span> <span class="n">TextAreaTagHelper</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="kd">public</span> <span class="n">ExtendedTextareaTagHelper</span><span class="p">(</span><span class="n">IHtmlGenerator</span> <span class="n">generator</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">            <span class="p">:</span> <span class="k">base</span><span class="p">(</span><span class="n">generator</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="kd">public</span> <span class="kd">override</span> <span class="k">void</span> <span class="n">Process</span><span class="p">(</span><span class="n">TagHelperContext</span> <span class="n">context</span><span class="p">,</span> <span class="n">TagHelperOutput</span> <span class="n">output</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="p">{</span>
</span></span><span class="line"><span class="cl">            <span class="k">base</span><span class="p">.</span><span class="n">Process</span><span class="p">(</span><span class="n">context</span><span class="p">,</span> <span class="n">output</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">            <span class="k">if</span> <span class="p">(!</span><span class="n">output</span><span class="p">.</span><span class="n">Attributes</span><span class="p">.</span><span class="n">TryGetAttribute</span><span class="p">(</span><span class="s">&#34;maxlength&#34;</span><span class="p">,</span> <span class="k">out</span> <span class="n">TagHelperAttribute</span> <span class="n">maxLengthAttribute</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">            <span class="p">{</span>
</span></span><span class="line"><span class="cl">                <span class="k">return</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">            <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">            <span class="kt">var</span> <span class="n">description</span> <span class="p">=</span> <span class="s">$&#34;Only &lt;b&gt;{maxLengthAttribute.Value}&lt;/b&gt; characters allowed!&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">            <span class="n">output</span><span class="p">.</span><span class="n">PostElement</span><span class="p">.</span><span class="n">AppendHtml</span><span class="p">(</span><span class="n">description</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>Results:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl">// input
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">textarea</span> <span class="na">asp-for</span><span class="o">=</span><span class="s">&#34;Description&#34;</span> <span class="na">maxlength</span><span class="o">=</span><span class="s">&#34;1024&#34;</span><span class="p">&gt;&lt;/</span><span class="nt">textarea</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">// output
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">textarea</span> <span class="na">asp-for</span><span class="o">=</span><span class="s">&#34;Description&#34;</span> <span class="na">maxlength</span><span class="o">=</span><span class="s">&#34;1024&#34;</span><span class="p">&gt;&lt;/</span><span class="nt">textarea</span><span class="p">&gt;&lt;</span><span class="nt">p</span><span class="p">&gt;</span>Only <span class="p">&lt;</span><span class="nt">b</span><span class="p">&gt;</span>1024<span class="p">&lt;/</span><span class="nt">b</span><span class="p">&gt;</span> characters allowed!<span class="p">&lt;/</span><span class="nt">p</span><span class="p">&gt;</span>
</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="bonus-did-you-know-that-you-can-add-taghelper-to-any-html-element">BONUS: Did you know that you can add TagHelper to any HTML element?</h2>
<p>One of the great things about tag helpers is that you can make it work for any existing HTML tags. I’ve show you examples of extending existing tag helpers, but you can also create new tag helpers for any element.</p>
<p>As an example, you could create tag helper which would create sortable links for all table header cells (something linke <code>&lt;th asp-for=&quot;FirstName&quot;&gt;&lt;/th&gt;</code>). Another example could be printout out “Empty” inside a table with no rows.</p>
]]></content:encoded>
    </item>
  </channel>
</rss>
