<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Kenneth Okalang</title>
    <description>The latest articles on DEV Community by Kenneth Okalang (@okalangkenneth).</description>
    <link>https://dev.to/okalangkenneth</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F641558%2F8f386b13-5a60-4157-ad33-f24ca86225ec.png</url>
      <title>DEV Community: Kenneth Okalang</title>
      <link>https://dev.to/okalangkenneth</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/okalangkenneth"/>
    <language>en</language>
    <item>
      <title>Paging Before Projecting: Fixing a Slow Multi-Tenant Admin List in OrchardCore</title>
      <dc:creator>Kenneth Okalang</dc:creator>
      <pubDate>Sat, 08 Aug 2026 07:52:18 +0000</pubDate>
      <link>https://dev.to/okalangkenneth/paging-before-projecting-fixing-a-slow-multi-tenant-admin-list-in-orchardcore-6ce</link>
      <guid>https://dev.to/okalangkenneth/paging-before-projecting-fixing-a-slow-multi-tenant-admin-list-in-orchardcore-6ce</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for &lt;a href="https://dev.to/bugsmash"&gt;DEV's Summer Bug Smash: Clear the Lineup&lt;/a&gt; powered by &lt;a href="https://sentry.io/" rel="noopener noreferrer"&gt;Sentry&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Project Overview
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/OrchardCMS/OrchardCore" rel="noopener noreferrer"&gt;OrchardCore&lt;/a&gt; is an open-source, modular, multi-tenant application framework and CMS built on ASP.NET Core. In a multi-tenant deployment, the Tenants admin page is where administrators manage every tenant on the instance, searching, filtering by category or status, and paging through the list.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bug Fix or Performance Improvement
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/OrchardCMS/OrchardCore/issues/19556" rel="noopener noreferrer"&gt;Issue #19556&lt;/a&gt; reported that the tenants admin list got noticeably slow to load as the tenant count grew. The root cause was in &lt;code&gt;AdminController.Index&lt;/code&gt;: the pipeline was projecting every tenant into a &lt;code&gt;ShellSettingsEntry&lt;/code&gt;, which involves reading each tenant's Category/Description config and generating a protection token via &lt;code&gt;dataProtector.Protect&lt;/code&gt;, &lt;em&gt;before&lt;/em&gt; filtering, sorting, and paging were applied. That meant those relatively expensive per-tenant reads ran once for every tenant in the system, even though only aprox 10 rows are ever rendered on a single page.&lt;/p&gt;

&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;

&lt;p&gt;PR: &lt;a href="https://github.com/OrchardCMS/OrchardCore/pull/19557" rel="noopener noreferrer"&gt;https://github.com/OrchardCMS/OrchardCore/pull/19557&lt;/a&gt;&lt;br&gt;
Closes #19556&lt;/p&gt;

&lt;h2&gt;
  
  
  My Improvements
&lt;/h2&gt;

&lt;p&gt;The fix reorders the pipeline so cheap operations happen first, and expensive ones happen last:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;*&lt;em&gt;Filter first *&lt;/em&gt;- apply search, category, and status filters against lightweight &lt;code&gt;ShellSettings&lt;/code&gt; data, not the fully projected view model. The category filter only reads &lt;code&gt;settings["Category"]&lt;/code&gt; when a category filter is actually active.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sort next&lt;/strong&gt;-order the filtered, still-cheap result set.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Page&lt;/strong&gt;-slice down to just the current page's rows.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Project last&lt;/strong&gt;-only &lt;em&gt;now&lt;/em&gt; build the full &lt;code&gt;ShellSettingsEntry&lt;/code&gt; (config reads + token generation) for the handful of tenants that will actually be displayed.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;One regression surfaced during review: an early version of the reorder accidentally applied a blanket &lt;code&gt;.OrderBy&lt;/code&gt; that changed the Category dropdown's ordering. That was fixed by scoping the &lt;code&gt;.OrderBy&lt;/code&gt; specifically to the dropdown's &lt;code&gt;GroupBy&lt;/code&gt;, preserving the original alphabetical order without reintroducing the sort across the whole list. A regression test for tenant admin paging was added before merge.&lt;/p&gt;

&lt;p&gt;Two related fixes-caching for the category dropdown, and per-tenant semaphore/async warmup in `ShellSettingsManager '- were identified but deliberately left out of scope for this PR to keep the change focused and reviewable.&lt;/p&gt;

&lt;p&gt;Merged by sebastienros into &lt;code&gt;OrchardCMS: main&lt;/code&gt;, milestone 4.x, flagged as a possible backport candidate.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>bugsmash</category>
    </item>
    <item>
      <title>Project on Inspection Evaluation</title>
      <dc:creator>Kenneth Okalang</dc:creator>
      <pubDate>Tue, 15 Jun 2021 09:07:19 +0000</pubDate>
      <link>https://dev.to/okalangkenneth/project-on-inspection-evaluation-25cb</link>
      <guid>https://dev.to/okalangkenneth/project-on-inspection-evaluation-25cb</guid>
      <description>&lt;p&gt;About a week ago I started a project to help an inspection company that I worked for ten years ago. Most of the operations which included receiving orders from clients, assigning jobs to inspectors, receiving and entering inspection reports were all done manually, prone to errors, and time-consuming.  The project is called 'Project Evaluation' and it is a web application that can be used for monitoring and evaluating various activities and solve the usual problems associated with entering data manually. &lt;br&gt;
Every day I  tweet to #100DaysOfCode so you can follow my progress there. Alternatively, check me out on &lt;a href="https://github.com/okalangkenneth" rel="noopener noreferrer"&gt;https://github.com/okalangkenneth&lt;/a&gt;&lt;br&gt;
under projects. &lt;/p&gt;

</description>
    </item>
    <item>
      <title>My software developer journey.</title>
      <dc:creator>Kenneth Okalang</dc:creator>
      <pubDate>Fri, 04 Jun 2021 10:15:31 +0000</pubDate>
      <link>https://dev.to/okalangkenneth/my-software-developer-journey-ddg</link>
      <guid>https://dev.to/okalangkenneth/my-software-developer-journey-ddg</guid>
      <description>&lt;p&gt;I graduated with a Masters degree in Economics way back in 2008 but never got an opportunity to work in an organization where I could impart the knowledge and skills I had gained. For about one year I was unemployed but then decided to try out running my own business. I was cash strapped then obviously after studies but was lucky to obtain a loan from the bank to start a taxi business. &lt;/p&gt;

&lt;p&gt;All was going quite well until the beginning of 2020 with the onslaught of Covid-19 pendemic. The taxi business dropped by more than 90% as movement was restricted. Luckily enough the government came to our rescue. We were given financial assistance and opportunities to change careers through tailor made programs targeting sectors that were hit hardest by the pandemic. This included the taxi sector. One of the opportunities was a six-month online dotnet System Development course. I was so intrigued by automation. I initially registered for an online python program  but also learned that dotnet framework does well too with automation. My educational background encouraged me as well to go into programming. &lt;/p&gt;

&lt;p&gt;It was such a long time that I was in class and wondered whether I would be able to coup with all the 'rust' on me. In January 2021, I was enrolled in the course. As of today I have got both personal guidance from professional IT trainers and attended labs with fellow course mates. I have gained the knowledge and skills in programming to be able to develop IT systems, applications, and more. &lt;/p&gt;

&lt;p&gt;The course is officially ending on the 6th May 2021 and hopefully will be able to do an internship with a company that needs dotnet System developers. &lt;/p&gt;

</description>
      <category>csharp</category>
      <category>dotnet</category>
    </item>
  </channel>
</rss>
