Repository navigation
Expand file tree
/
Copy pathindex.html
More file actions
8 lines (8 loc) · 39.8 KB
/
Copy pathindex.html
File metadata and controls
8 lines (8 loc) · 39.8 KB
1
2
3
4
5
6
7
8
<!doctype html><html lang="en"><head><meta charset="utf-8"/><meta name="color-scheme" content="light dark"/><meta name="viewport" content="width=device-width,initial-scale=1"/><title>ByteAether: .NET, C# and Software Architecture Blog</title><meta name="description" content="Articles on .NET and C# by Joonatan Uusväli: ULID identifiers, enterprise data access layers, LINQ-based UI integration and API design."/><meta name="author" content="Joonatan Uusväli"/><link rel="canonical" href="https://byteaether.github.io/"/><script type="application/ld+json">{"@context":"https://schema.org","@graph":[{"@type":"WebSite","name":"ByteAether","url":"https://byteaether.github.io/","description":"Decoding complexity to craft beautiful simplicity.","inLanguage":"en","publisher":{"@type":"Person","name":"Joonatan Uusväli","url":"https://byteaether.github.io/about/","sameAs":["https://www.linkedin.com/in/joonatan-uusvali/","https://github.com/ByteAether"]}}]}</script><link rel="icon" href="/favicon.ico" sizes="any"/><link rel="icon" href="/favicon.svg" type="image/svg+xml"/><link rel="apple-touch-icon" href="/apple-touch-icon.png"/><link rel="manifest" href="/manifest.webmanifest"/><meta property="og:url" content="https://byteaether.github.io/"/><meta property="og:type" content="website"/><meta property="og:site_name" content="ByteAether"/><meta property="og:locale" content="en_US"/><meta property="og:title" content="ByteAether: .NET, C# and Software Architecture Blog"/><meta property="og:description" content="Articles on .NET and C# by Joonatan Uusväli: ULID identifiers, enterprise data access layers, LINQ-based UI integration and API design."/><meta property="og:image" content="https://byteaether.github.io/icon-512.png"/><meta property="og:image:type" content="image/png"/><meta property="og:image:width" content="512"/><meta property="og:image:height" content="512"/><meta property="og:image:alt" content="ByteAether logo"/><meta name="twitter:card" content="summary"/><meta name="twitter:title" content="ByteAether: .NET, C# and Software Architecture Blog"/><meta name="twitter:description" content="Articles on .NET and C# by Joonatan Uusväli: ULID identifiers, enterprise data access layers, LINQ-based UI integration and API design."/><meta name="twitter:image" content="https://byteaether.github.io/icon-512.png"/><meta name="twitter:image:alt" content="ByteAether logo"/><meta name="robots" content="index, follow"/><link rel="alternate" href="https://byteaether.github.io/feed/feed.xml" type="application/atom+xml" title="ByteAether"/><link rel="alternate" href="https://byteaether.github.io/feed/feed.json" type="application/feed+json" title="ByteAether"/><meta name="format-detection" content="telephone=no"/><meta name="generator" content="Eleventy v3.1.2"/><link rel="stylesheet" href="/css/e3zFwp7_Xa.css"/><link rel="stylesheet" href="/css/203QJOEW2o.css"/><script type="text/javascript">const themeManager={init:function(){this.set(this.get())},toggle:function(){this.set("dark"==this.get()?"light":"dark")},set:function(e){document.documentElement.dataset.theme=e,document.documentElement.style.colorScheme=e,localStorage.theme=e,this.updateGiscusTheme()},get:function(){return document.documentElement.dataset.theme??localStorage.theme??(window.matchMedia&&window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":null)??"light"},updateGiscusTheme:function(){const e="dark"===themeManager.get()?"dark":"light",t=document.querySelector("iframe.giscus-frame");t&&t.contentWindow.postMessage({giscus:{setConfig:{theme:e}}},"https://giscus.app")}};themeManager.init()</script></head><body><a href="#skip" class="visually-hidden skip-link">Skip to main content</a><header><div id="header-container"><input type="checkbox" id="nav-toggle" class="nav-toggle" aria-label="Toggle navigation menu"/> <a href="/" class="header-left"><img src="/assets/icon.svg" alt="Logo" class="logo-img"/> ByteAether</a><nav class="desktop-nav"><ul><li><a href="/" aria-current="page">Home</a></li><li><a href="/search/">Search</a></li><li><a href="/series/">Series</a></li><li><a href="/tags/">Tags</a></li><li><a href="/archive/">Archive</a></li><li><a href="/about/">About</a></li></ul></nav><div class="header-right"><a href="https://github.com/ByteAether" title="ByteAether" target="_blank"><svg class="icon" aria-hidden="true"><use href="#fab-fa-github" xlink:href="#fab-fa-github"></use></svg></a><a href="/feed/feed.xml" title="Feed" target="_blank"><svg class="icon" aria-hidden="true"><use href="#fas-fa-square-rss" xlink:href="#fas-fa-square-rss"></use></svg></a><button type="button" onclick="themeManager.toggle()" aria-label="Toggle light and dark theme"><svg class="icon" aria-hidden="true"><use href="#fas-fa-sun" xlink:href="#fas-fa-sun"></use></svg></button> <label for="nav-toggle" class="burger-menu"><svg class="icon" aria-hidden="true"><use href="#fas-fa-bars" xlink:href="#fas-fa-bars"></use></svg></label></div><nav class="mobile-nav"><ul><li><a href="/" aria-current="page">Home</a></li><li><a href="/search/">Search</a></li><li><a href="/series/">Series</a></li><li><a href="/tags/">Tags</a></li><li><a href="/archive/">Archive</a></li><li><a href="/about/">About</a></li></ul></nav></div></header><div class="content-wrapper"><main id="skip" style="grid-area:main"><heading-anchors><h1>ByteAether: a .NET and software architecture blog</h1><p>Step into <b>ByteAether</b>, where cutting-edge technology fuels intellectual discovery. This platform is dedicated to providing robust content on <b>.NET and C# development</b>, advanced <b>software engineering principles</b>, and the latest advancements from our <b>open-source initiatives</b>. ByteAether offers practical tools, discerning insights, and collaborative discussions, empowering developers from novice to expert.</p><p>Our content spans <b><a href="https://www.nuget.org/packages?q=ByteAether.*" target="_blank">NuGet package releases</a></b>, strategic approaches to complex technical challenges, and refined techniques to streamline your development workflow. To learn more about the expertise driving ByteAether, please visit the <a href="/about">About</a> section. We appreciate your visit and encourage you to explore, learn, and elevate your coding proficiency.</p><h2>Latest 8 Posts of 23</h2><div class="posts"><div class="box post-card"><h2><a href="/2026/byteaetherulid-v142-expands-the-net-ecosystem-with-aspnet-core-and-cli-support/"><picture><source type="image/avif" srcset="/2026/byteaetherulid-v142-expands-the-net-ecosystem-with-aspnet-core-and-cli-support/JhqgFBbFke-400.avif 400w, /2026/byteaetherulid-v142-expands-the-net-ecosystem-with-aspnet-core-and-cli-support/JhqgFBbFke-800.avif 800w, /2026/byteaetherulid-v142-expands-the-net-ecosystem-with-aspnet-core-and-cli-support/JhqgFBbFke-1200.avif 1200w" sizes="(min-width: 700px) 50vw, 100vw"/><source type="image/webp" srcset="/2026/byteaetherulid-v142-expands-the-net-ecosystem-with-aspnet-core-and-cli-support/JhqgFBbFke-400.webp 400w, /2026/byteaetherulid-v142-expands-the-net-ecosystem-with-aspnet-core-and-cli-support/JhqgFBbFke-800.webp 800w, /2026/byteaetherulid-v142-expands-the-net-ecosystem-with-aspnet-core-and-cli-support/JhqgFBbFke-1200.webp 1200w" sizes="(min-width: 700px) 50vw, 100vw"/><img src="/2026/byteaetherulid-v142-expands-the-net-ecosystem-with-aspnet-core-and-cli-support/JhqgFBbFke-400.jpeg" alt="" class="banner" decoding="async" loading="lazy" width="1200" height="685" srcset="/2026/byteaetherulid-v142-expands-the-net-ecosystem-with-aspnet-core-and-cli-support/JhqgFBbFke-400.jpeg 400w, /2026/byteaetherulid-v142-expands-the-net-ecosystem-with-aspnet-core-and-cli-support/JhqgFBbFke-800.jpeg 800w, /2026/byteaetherulid-v142-expands-the-net-ecosystem-with-aspnet-core-and-cli-support/JhqgFBbFke-1200.jpeg 1200w" sizes="(min-width: 700px) 50vw, 100vw"/></picture><div class="title-text">ByteAether.Ulid v1.4.2 Expands the .NET Ecosystem with ASP.NET Core and CLI Support</div></a></h2><div class="excerpt">A production-grade identifier library requires tight integration across data persistence layers, API boundary definitions, and operational tooling. ByteAether.Ulid implements a high-performance, specification-compliant .NET type for the ULID standard, engineering strict monotonicity, throughput optimization, and deterministic ordering under high-concurrency workloads.</div><div class="post-metadata"><div><svg class="icon" aria-hidden="true"><use href="#far-fa-calendar" xlink:href="#far-fa-calendar"></use></svg> <time datetime="2026-10-14" data-pagefind-meta="Published" title="Published at 2026-10-14">2026-10-14</time> <span style="display:none" data-pagefind-filter="Year">2026</span></div><div data-words="730 words"><svg class="icon" aria-hidden="true"><use href="#far-fa-clock" xlink:href="#far-fa-clock"></use></svg> 4 minutes</div><div><svg class="icon" aria-hidden="true"><use href="#fas-fa-rectangle-list" xlink:href="#fas-fa-rectangle-list"></use></svg> <span class="serie" data-pagefind-filter="Series"><a href="/series/byteaether-ulid/">ByteAether.Ulid</a></span></div><div><svg class="icon" aria-hidden="true"><use href="#fas-fa-tags" xlink:href="#fas-fa-tags"></use></svg> <span class="tag" data-pagefind-filter="Tags"><a href="/tags/ulid/">ULID</a></span> <span class="tag" data-pagefind-filter="Tags"><a href="/tags/asp-net-core/">ASP.NET Core</a></span> <span class="tag" data-pagefind-filter="Tags"><a href="/tags/cli/">CLI</a></span> <span class="tag" data-pagefind-filter="Tags"><a href="/tags/net/">.NET</a></span> <span class="tag" data-pagefind-filter="Tags"><a href="/tags/developer-tools/">Developer Tools</a></span> <span class="tag" data-pagefind-filter="Tags"><a href="/tags/openapi/">OpenAPI</a></span> <span class="tag" data-pagefind-filter="Tags"><a href="/tags/performance/">Performance</a></span> <span class="tag" data-pagefind-filter="Tags"><a href="/tags/security/">Security</a></span></div></div></div><div class="box post-card"><h2><a href="/2026/streamlining-net-data-layers-with-byteaetherulid-v140/"><picture><source type="image/avif" srcset="/2026/streamlining-net-data-layers-with-byteaetherulid-v140/kqo362vMCl-400.avif 400w, /2026/streamlining-net-data-layers-with-byteaetherulid-v140/kqo362vMCl-800.avif 800w, /2026/streamlining-net-data-layers-with-byteaetherulid-v140/kqo362vMCl-1200.avif 1200w" sizes="(min-width: 700px) 50vw, 100vw"/><source type="image/webp" srcset="/2026/streamlining-net-data-layers-with-byteaetherulid-v140/kqo362vMCl-400.webp 400w, /2026/streamlining-net-data-layers-with-byteaetherulid-v140/kqo362vMCl-800.webp 800w, /2026/streamlining-net-data-layers-with-byteaetherulid-v140/kqo362vMCl-1200.webp 1200w" sizes="(min-width: 700px) 50vw, 100vw"/><img src="/2026/streamlining-net-data-layers-with-byteaetherulid-v140/kqo362vMCl-400.jpeg" alt="" class="banner" decoding="async" loading="lazy" width="1200" height="685" srcset="/2026/streamlining-net-data-layers-with-byteaetherulid-v140/kqo362vMCl-400.jpeg 400w, /2026/streamlining-net-data-layers-with-byteaetherulid-v140/kqo362vMCl-800.jpeg 800w, /2026/streamlining-net-data-layers-with-byteaetherulid-v140/kqo362vMCl-1200.jpeg 1200w" sizes="(min-width: 700px) 50vw, 100vw"/></picture><div class="title-text">Streamlining .NET Data Layers with ByteAether.Ulid v1.4.0</div></a></h2><div class="excerpt">The choice of data identifiers dictates database performance, indexing efficiency, and security vectors at scale. For high-volume distributed systems, legacy options present clear operational drawbacks. Standard sequential integer identifiers expose internal operational velocity and collapse under cross-region replication due to centralized state bottlenecks. Traditional UUIDv4 variants eliminate the synchronization bottleneck but introduce severe index fragmentation within B-tree structures,...</div><div class="post-metadata"><div><svg class="icon" aria-hidden="true"><use href="#far-fa-calendar" xlink:href="#far-fa-calendar"></use></svg> <time datetime="2026-07-22" data-pagefind-meta="Published" title="Published at 2026-07-22">2026-07-22</time> <span style="display:none" data-pagefind-filter="Year">2026</span></div><div data-words="2,478 words"><svg class="icon" aria-hidden="true"><use href="#far-fa-clock" xlink:href="#far-fa-clock"></use></svg> 12 minutes</div><div><svg class="icon" aria-hidden="true"><use href="#fas-fa-rectangle-list" xlink:href="#fas-fa-rectangle-list"></use></svg> <span class="serie" data-pagefind-filter="Series"><a href="/series/byteaether-ulid/">ByteAether.Ulid</a></span></div><div><svg class="icon" aria-hidden="true"><use href="#fas-fa-tags" xlink:href="#fas-fa-tags"></use></svg> <span class="tag" data-pagefind-filter="Tags"><a href="/tags/ulid/">ULID</a></span> <span class="tag" data-pagefind-filter="Tags"><a href="/tags/database/">Database</a></span> <span class="tag" data-pagefind-filter="Tags"><a href="/tags/linqtodb/">LinqToDB</a></span> <span class="tag" data-pagefind-filter="Tags"><a href="/tags/entity-framework/">Entity Framework</a></span> <span class="tag" data-pagefind-filter="Tags"><a href="/tags/dapper/">Dapper</a></span> <span class="tag" data-pagefind-filter="Tags"><a href="/tags/performance/">Performance</a></span> <span class="tag" data-pagefind-filter="Tags"><a href="/tags/security/">Security</a></span></div></div></div><div class="box post-card"><h2><a href="/2026/the-architecture-of-obsession-why-byteaetherulid-is-the-last-identifier-library-you-will-ever-need/"><picture><source type="image/avif" srcset="/2026/the-architecture-of-obsession-why-byteaetherulid-is-the-last-identifier-library-you-will-ever-need/W5zgX83eKP-400.avif 400w, /2026/the-architecture-of-obsession-why-byteaetherulid-is-the-last-identifier-library-you-will-ever-need/W5zgX83eKP-800.avif 800w, /2026/the-architecture-of-obsession-why-byteaetherulid-is-the-last-identifier-library-you-will-ever-need/W5zgX83eKP-1200.avif 1200w" sizes="(min-width: 700px) 50vw, 100vw"/><source type="image/webp" srcset="/2026/the-architecture-of-obsession-why-byteaetherulid-is-the-last-identifier-library-you-will-ever-need/W5zgX83eKP-400.webp 400w, /2026/the-architecture-of-obsession-why-byteaetherulid-is-the-last-identifier-library-you-will-ever-need/W5zgX83eKP-800.webp 800w, /2026/the-architecture-of-obsession-why-byteaetherulid-is-the-last-identifier-library-you-will-ever-need/W5zgX83eKP-1200.webp 1200w" sizes="(min-width: 700px) 50vw, 100vw"/><img src="/2026/the-architecture-of-obsession-why-byteaetherulid-is-the-last-identifier-library-you-will-ever-need/W5zgX83eKP-400.jpeg" alt="" class="banner" decoding="async" loading="lazy" width="1200" height="685" srcset="/2026/the-architecture-of-obsession-why-byteaetherulid-is-the-last-identifier-library-you-will-ever-need/W5zgX83eKP-400.jpeg 400w, /2026/the-architecture-of-obsession-why-byteaetherulid-is-the-last-identifier-library-you-will-ever-need/W5zgX83eKP-800.jpeg 800w, /2026/the-architecture-of-obsession-why-byteaetherulid-is-the-last-identifier-library-you-will-ever-need/W5zgX83eKP-1200.jpeg 1200w" sizes="(min-width: 700px) 50vw, 100vw"/></picture><div class="title-text">The Architecture of Obsession: Why ByteAether.Ulid is the Last Identifier Library You Will Ever Need</div></a></h2><div class="excerpt">Most developers treat unique identifiers like plumbing. You want them to work, you want them to be out of sight, and you certainly do not want to spend your Friday nights thinking about them. For the average CRUD application, Guid.NewGuid() is a perfectly acceptable choice. However, if you are reading this, you are likely not an average developer. You are an architect or a senior engineer who understands that at scale, "good enough" is a ticking time bomb of index fragmentation and out-of-order...</div><div class="post-metadata"><div><svg class="icon" aria-hidden="true"><use href="#far-fa-calendar" xlink:href="#far-fa-calendar"></use></svg> <time datetime="2026-04-02" data-pagefind-meta="Published" title="Published at 2026-04-02, updated at 2026-07-27">2026-04-02</time> <span style="display:none" data-pagefind-filter="Year">2026</span></div><div data-words="1,153 words"><svg class="icon" aria-hidden="true"><use href="#far-fa-clock" xlink:href="#far-fa-clock"></use></svg> 6 minutes</div><div><svg class="icon" aria-hidden="true"><use href="#fas-fa-rectangle-list" xlink:href="#fas-fa-rectangle-list"></use></svg> <span class="serie" data-pagefind-filter="Series"><a href="/series/byteaether-ulid/">ByteAether.Ulid</a></span></div><div><svg class="icon" aria-hidden="true"><use href="#fas-fa-tags" xlink:href="#fas-fa-tags"></use></svg> <span class="tag" data-pagefind-filter="Tags"><a href="/tags/ulid/">ULID</a></span> <span class="tag" data-pagefind-filter="Tags"><a href="/tags/uuid/">UUID</a></span> <span class="tag" data-pagefind-filter="Tags"><a href="/tags/guid/">GUID</a></span> <span class="tag" data-pagefind-filter="Tags"><a href="/tags/id/">ID</a></span> <span class="tag" data-pagefind-filter="Tags"><a href="/tags/uuidv7/">UUIDv7</a></span> <span class="tag" data-pagefind-filter="Tags"><a href="/tags/performance/">Performance</a></span> <span class="tag" data-pagefind-filter="Tags"><a href="/tags/security/">Security</a></span></div></div></div><div class="box post-card"><h2><a href="/2026/the-weight-of-decisions-solving-weighted-random-sorting-at-scale/"><picture><source type="image/avif" srcset="/2026/the-weight-of-decisions-solving-weighted-random-sorting-at-scale/ld2M0Y2mkH-400.avif 400w, /2026/the-weight-of-decisions-solving-weighted-random-sorting-at-scale/ld2M0Y2mkH-800.avif 800w, /2026/the-weight-of-decisions-solving-weighted-random-sorting-at-scale/ld2M0Y2mkH-1200.avif 1200w" sizes="(min-width: 700px) 50vw, 100vw"/><source type="image/webp" srcset="/2026/the-weight-of-decisions-solving-weighted-random-sorting-at-scale/ld2M0Y2mkH-400.webp 400w, /2026/the-weight-of-decisions-solving-weighted-random-sorting-at-scale/ld2M0Y2mkH-800.webp 800w, /2026/the-weight-of-decisions-solving-weighted-random-sorting-at-scale/ld2M0Y2mkH-1200.webp 1200w" sizes="(min-width: 700px) 50vw, 100vw"/><img src="/2026/the-weight-of-decisions-solving-weighted-random-sorting-at-scale/ld2M0Y2mkH-400.jpeg" alt="" class="banner" decoding="async" loading="lazy" width="1200" height="685" srcset="/2026/the-weight-of-decisions-solving-weighted-random-sorting-at-scale/ld2M0Y2mkH-400.jpeg 400w, /2026/the-weight-of-decisions-solving-weighted-random-sorting-at-scale/ld2M0Y2mkH-800.jpeg 800w, /2026/the-weight-of-decisions-solving-weighted-random-sorting-at-scale/ld2M0Y2mkH-1200.jpeg 1200w" sizes="(min-width: 700px) 50vw, 100vw"/></picture><div class="title-text">The Weight of Decisions: Solving Weighted Random Sorting at Scale</div></a></h2><div class="excerpt">Several years ago at Microsoft, I worked on a back-end service responsible for routing high volumes of traffic. The service functioned as a traffic dispatcher: we received an incoming request, determined the most appropriate downstream destination, and forwarded the payload.</div><div class="post-metadata"><div><svg class="icon" aria-hidden="true"><use href="#far-fa-calendar" xlink:href="#far-fa-calendar"></use></svg> <time datetime="2026-01-07" data-pagefind-meta="Published" title="Published at 2026-01-07">2026-01-07</time> <span style="display:none" data-pagefind-filter="Year">2026</span></div><div data-words="926 words"><svg class="icon" aria-hidden="true"><use href="#far-fa-clock" xlink:href="#far-fa-clock"></use></svg> 5 minutes</div><div></div><div><svg class="icon" aria-hidden="true"><use href="#fas-fa-tags" xlink:href="#fas-fa-tags"></use></svg> <span class="tag" data-pagefind-filter="Tags"><a href="/tags/algorithms/">Algorithms</a></span> <span class="tag" data-pagefind-filter="Tags"><a href="/tags/performance/">Performance</a></span></div></div></div><div class="box post-card"><h2><a href="/2025/building-an-enterprise-data-access-layer-automated-user-auditing-and-series-wrap-up/"><picture><source type="image/avif" srcset="/2025/building-an-enterprise-data-access-layer-automated-user-auditing-and-series-wrap-up/nDci999DS2-400.avif 400w, /2025/building-an-enterprise-data-access-layer-automated-user-auditing-and-series-wrap-up/nDci999DS2-800.avif 800w, /2025/building-an-enterprise-data-access-layer-automated-user-auditing-and-series-wrap-up/nDci999DS2-1200.avif 1200w" sizes="(min-width: 700px) 50vw, 100vw"/><source type="image/webp" srcset="/2025/building-an-enterprise-data-access-layer-automated-user-auditing-and-series-wrap-up/nDci999DS2-400.webp 400w, /2025/building-an-enterprise-data-access-layer-automated-user-auditing-and-series-wrap-up/nDci999DS2-800.webp 800w, /2025/building-an-enterprise-data-access-layer-automated-user-auditing-and-series-wrap-up/nDci999DS2-1200.webp 1200w" sizes="(min-width: 700px) 50vw, 100vw"/><img src="/2025/building-an-enterprise-data-access-layer-automated-user-auditing-and-series-wrap-up/nDci999DS2-400.jpeg" alt="" class="banner" decoding="async" loading="lazy" width="1200" height="685" srcset="/2025/building-an-enterprise-data-access-layer-automated-user-auditing-and-series-wrap-up/nDci999DS2-400.jpeg 400w, /2025/building-an-enterprise-data-access-layer-automated-user-auditing-and-series-wrap-up/nDci999DS2-800.jpeg 800w, /2025/building-an-enterprise-data-access-layer-automated-user-auditing-and-series-wrap-up/nDci999DS2-1200.jpeg 1200w" sizes="(min-width: 700px) 50vw, 100vw"/></picture><div class="title-text">Building an Enterprise Data Access Layer: Automated User Auditing and Series Wrap-up</div></a></h2><div class="excerpt">Welcome to the seventh and final article in our series on building an enterprise-grade Data Access Layer (DAL) in C#. Over the last six posts, we have methodically built a robust, automated, and secure DAL using a database-first philosophy with C# and LinqToDB.</div><div class="post-metadata"><div><svg class="icon" aria-hidden="true"><use href="#far-fa-calendar" xlink:href="#far-fa-calendar"></use></svg> <time datetime="2025-12-01" data-pagefind-meta="Published" title="Published at 2025-12-01">2025-12-01</time> <span style="display:none" data-pagefind-filter="Year">2025</span></div><div data-words="1,842 words"><svg class="icon" aria-hidden="true"><use href="#far-fa-clock" xlink:href="#far-fa-clock"></use></svg> 9 minutes</div><div><svg class="icon" aria-hidden="true"><use href="#fas-fa-rectangle-list" xlink:href="#fas-fa-rectangle-list"></use></svg> <span class="serie" data-pagefind-filter="Series"><a href="/series/enterprise-dal/">Enterprise DAL</a></span></div><div><svg class="icon" aria-hidden="true"><use href="#fas-fa-tags" xlink:href="#fas-fa-tags"></use></svg> <span class="tag" data-pagefind-filter="Tags"><a href="/tags/linqtodb/">LinqToDB</a></span> <span class="tag" data-pagefind-filter="Tags"><a href="/tags/database/">Database</a></span> <span class="tag" data-pagefind-filter="Tags"><a href="/tags/sql/">SQL</a></span> <span class="tag" data-pagefind-filter="Tags"><a href="/tags/linq/">LINQ</a></span></div></div></div><div class="box post-card"><h2><a href="/2025/building-an-enterprise-data-access-layer-composable-row-level-security/"><picture><source type="image/avif" srcset="/2025/building-an-enterprise-data-access-layer-composable-row-level-security/NEn6U7Em8l-400.avif 400w, /2025/building-an-enterprise-data-access-layer-composable-row-level-security/NEn6U7Em8l-800.avif 800w, /2025/building-an-enterprise-data-access-layer-composable-row-level-security/NEn6U7Em8l-1200.avif 1200w" sizes="(min-width: 700px) 50vw, 100vw"/><source type="image/webp" srcset="/2025/building-an-enterprise-data-access-layer-composable-row-level-security/NEn6U7Em8l-400.webp 400w, /2025/building-an-enterprise-data-access-layer-composable-row-level-security/NEn6U7Em8l-800.webp 800w, /2025/building-an-enterprise-data-access-layer-composable-row-level-security/NEn6U7Em8l-1200.webp 1200w" sizes="(min-width: 700px) 50vw, 100vw"/><img src="/2025/building-an-enterprise-data-access-layer-composable-row-level-security/NEn6U7Em8l-400.jpeg" alt="" class="banner" decoding="async" loading="lazy" width="1200" height="685" srcset="/2025/building-an-enterprise-data-access-layer-composable-row-level-security/NEn6U7Em8l-400.jpeg 400w, /2025/building-an-enterprise-data-access-layer-composable-row-level-security/NEn6U7Em8l-800.jpeg 800w, /2025/building-an-enterprise-data-access-layer-composable-row-level-security/NEn6U7Em8l-1200.jpeg 1200w" sizes="(min-width: 700px) 50vw, 100vw"/></picture><div class="title-text">Building an Enterprise Data Access Layer: Composable Row-Level Security</div></a></h2><div class="excerpt">Welcome to the sixth post in our series on building a feature-rich, automated enterprise Data Access Layer (DAL) using C# and LinqToDB. In our previous articles, we established a powerful architectural pattern: a composable global query filter system. This system allows us to define cross-cutting concerns as simple interfaces, automatically combining and applying them to every relevant query.</div><div class="post-metadata"><div><svg class="icon" aria-hidden="true"><use href="#far-fa-calendar" xlink:href="#far-fa-calendar"></use></svg> <time datetime="2025-11-24" data-pagefind-meta="Published" title="Published at 2025-11-24, updated at 2025-12-08">2025-11-24</time> <span style="display:none" data-pagefind-filter="Year">2025</span></div><div data-words="1,547 words"><svg class="icon" aria-hidden="true"><use href="#far-fa-clock" xlink:href="#far-fa-clock"></use></svg> 8 minutes</div><div><svg class="icon" aria-hidden="true"><use href="#fas-fa-rectangle-list" xlink:href="#fas-fa-rectangle-list"></use></svg> <span class="serie" data-pagefind-filter="Series"><a href="/series/enterprise-dal/">Enterprise DAL</a></span></div><div><svg class="icon" aria-hidden="true"><use href="#fas-fa-tags" xlink:href="#fas-fa-tags"></use></svg> <span class="tag" data-pagefind-filter="Tags"><a href="/tags/linqtodb/">LinqToDB</a></span> <span class="tag" data-pagefind-filter="Tags"><a href="/tags/database/">Database</a></span> <span class="tag" data-pagefind-filter="Tags"><a href="/tags/sql/">SQL</a></span> <span class="tag" data-pagefind-filter="Tags"><a href="/tags/linq/">LINQ</a></span></div></div></div><div class="box post-card"><h2><a href="/2025/announcing-byteaetherulid-132-net-10-support-and-optimized-design/"><picture><source type="image/avif" srcset="/2025/announcing-byteaetherulid-132-net-10-support-and-optimized-design/iY2eJWeELo-400.avif 400w, /2025/announcing-byteaetherulid-132-net-10-support-and-optimized-design/iY2eJWeELo-800.avif 800w, /2025/announcing-byteaetherulid-132-net-10-support-and-optimized-design/iY2eJWeELo-1200.avif 1200w" sizes="(min-width: 700px) 50vw, 100vw"/><source type="image/webp" srcset="/2025/announcing-byteaetherulid-132-net-10-support-and-optimized-design/iY2eJWeELo-400.webp 400w, /2025/announcing-byteaetherulid-132-net-10-support-and-optimized-design/iY2eJWeELo-800.webp 800w, /2025/announcing-byteaetherulid-132-net-10-support-and-optimized-design/iY2eJWeELo-1200.webp 1200w" sizes="(min-width: 700px) 50vw, 100vw"/><img src="/2025/announcing-byteaetherulid-132-net-10-support-and-optimized-design/iY2eJWeELo-400.jpeg" alt="" class="banner" decoding="async" loading="lazy" width="1200" height="685" srcset="/2025/announcing-byteaetherulid-132-net-10-support-and-optimized-design/iY2eJWeELo-400.jpeg 400w, /2025/announcing-byteaetherulid-132-net-10-support-and-optimized-design/iY2eJWeELo-800.jpeg 800w, /2025/announcing-byteaetherulid-132-net-10-support-and-optimized-design/iY2eJWeELo-1200.jpeg 1200w" sizes="(min-width: 700px) 50vw, 100vw"/></picture><div class="title-text">Announcing ByteAether.Ulid 1.3.2: .NET 10 Support and Optimized Design</div></a></h2><div class="excerpt">We are excited to announce the release of ByteAether.Ulid version 1.3.2, which is now available on NuGet. This release introduces official support and dedicated binaries for the new .NET 10 platform, continuing our mission to provide the most performant, secure, and specification-compliant ULID (Universally Unique Lexicographically Sortable Identifier) implementation for the .NET ecosystem.</div><div class="post-metadata"><div><svg class="icon" aria-hidden="true"><use href="#far-fa-calendar" xlink:href="#far-fa-calendar"></use></svg> <time datetime="2025-11-14" data-pagefind-meta="Published" title="Published at 2025-11-14">2025-11-14</time> <span style="display:none" data-pagefind-filter="Year">2025</span></div><div data-words="852 words"><svg class="icon" aria-hidden="true"><use href="#far-fa-clock" xlink:href="#far-fa-clock"></use></svg> 4 minutes</div><div><svg class="icon" aria-hidden="true"><use href="#fas-fa-rectangle-list" xlink:href="#fas-fa-rectangle-list"></use></svg> <span class="serie" data-pagefind-filter="Series"><a href="/series/byteaether-ulid/">ByteAether.Ulid</a></span></div><div><svg class="icon" aria-hidden="true"><use href="#fas-fa-tags" xlink:href="#fas-fa-tags"></use></svg> <span class="tag" data-pagefind-filter="Tags"><a href="/tags/ulid/">ULID</a></span> <span class="tag" data-pagefind-filter="Tags"><a href="/tags/uuid/">UUID</a></span> <span class="tag" data-pagefind-filter="Tags"><a href="/tags/guid/">GUID</a></span> <span class="tag" data-pagefind-filter="Tags"><a href="/tags/id/">ID</a></span> <span class="tag" data-pagefind-filter="Tags"><a href="/tags/performance/">Performance</a></span> <span class="tag" data-pagefind-filter="Tags"><a href="/tags/news/">News</a></span></div></div></div><div class="box post-card"><h2><a href="/2025/building-an-enterprise-data-access-layer-composable-multi-tenancy-filtering/"><picture><source type="image/avif" srcset="/2025/building-an-enterprise-data-access-layer-composable-multi-tenancy-filtering/VF9LD5rehv-400.avif 400w, /2025/building-an-enterprise-data-access-layer-composable-multi-tenancy-filtering/VF9LD5rehv-800.avif 800w, /2025/building-an-enterprise-data-access-layer-composable-multi-tenancy-filtering/VF9LD5rehv-1200.avif 1200w" sizes="(min-width: 700px) 50vw, 100vw"/><source type="image/webp" srcset="/2025/building-an-enterprise-data-access-layer-composable-multi-tenancy-filtering/VF9LD5rehv-400.webp 400w, /2025/building-an-enterprise-data-access-layer-composable-multi-tenancy-filtering/VF9LD5rehv-800.webp 800w, /2025/building-an-enterprise-data-access-layer-composable-multi-tenancy-filtering/VF9LD5rehv-1200.webp 1200w" sizes="(min-width: 700px) 50vw, 100vw"/><img src="/2025/building-an-enterprise-data-access-layer-composable-multi-tenancy-filtering/VF9LD5rehv-400.jpeg" alt="" class="banner" decoding="async" loading="lazy" width="1200" height="685" srcset="/2025/building-an-enterprise-data-access-layer-composable-multi-tenancy-filtering/VF9LD5rehv-400.jpeg 400w, /2025/building-an-enterprise-data-access-layer-composable-multi-tenancy-filtering/VF9LD5rehv-800.jpeg 800w, /2025/building-an-enterprise-data-access-layer-composable-multi-tenancy-filtering/VF9LD5rehv-1200.jpeg 1200w" sizes="(min-width: 700px) 50vw, 100vw"/></picture><div class="title-text">Building an Enterprise Data Access Layer: Composable Multi-Tenancy Filtering</div></a></h2><div class="excerpt">In our previous articles, we established a robust foundation for our enterprise Data Access Layer (DAL). We began with a database-first approach using C# and LinqToDB, then implemented automated auditing for CreatedAt and ModifiedAt timestamps. Most recently, we engineered a powerful, composable global query filter system to handle soft-deletes transparently. This architecture was designed for extensibility, and in this post, we will leverage that investment to tackle one of the most critical...</div><div class="post-metadata"><div><svg class="icon" aria-hidden="true"><use href="#far-fa-calendar" xlink:href="#far-fa-calendar"></use></svg> <time datetime="2025-11-11" data-pagefind-meta="Published" title="Published at 2025-11-11, updated at 2025-12-08">2025-11-11</time> <span style="display:none" data-pagefind-filter="Year">2025</span></div><div data-words="1,837 words"><svg class="icon" aria-hidden="true"><use href="#far-fa-clock" xlink:href="#far-fa-clock"></use></svg> 9 minutes</div><div><svg class="icon" aria-hidden="true"><use href="#fas-fa-rectangle-list" xlink:href="#fas-fa-rectangle-list"></use></svg> <span class="serie" data-pagefind-filter="Series"><a href="/series/enterprise-dal/">Enterprise DAL</a></span></div><div><svg class="icon" aria-hidden="true"><use href="#fas-fa-tags" xlink:href="#fas-fa-tags"></use></svg> <span class="tag" data-pagefind-filter="Tags"><a href="/tags/linqtodb/">LinqToDB</a></span> <span class="tag" data-pagefind-filter="Tags"><a href="/tags/database/">Database</a></span> <span class="tag" data-pagefind-filter="Tags"><a href="/tags/sql/">SQL</a></span> <span class="tag" data-pagefind-filter="Tags"><a href="/tags/linq/">LINQ</a></span></div></div></div></div><nav class="pagination"><ul><li><span><<</span></li><li><span><</span></li><li class="active"><a href="/">1</a></li><li class=""><a href="/page/2/">2</a></li><li class=""><a href="/page/3/">3</a></li><li><a href="/page/2/">></a></li><li><a href="/page/3/">>></a></li></ul></nav></heading-anchors></main><div class="bottom-content" style="grid-area:bottom"></div></div><footer><div class="footer-container"><div>ByteAether 2025 - 2026</div><a href="https://github.com/ByteAether" title="ByteAether" target="_blank"><svg class="icon" aria-hidden="true"><use href="#fab-fa-github" xlink:href="#fab-fa-github"></use></svg></a><a href="/feed/feed.xml" title="Feed" target="_blank"><svg class="icon" aria-hidden="true"><use href="#fas-fa-square-rss" xlink:href="#fas-fa-square-rss"></use></svg></a><span onclick="themeManager.toggle()"><svg class="icon" aria-hidden="true"><use href="#fas-fa-sun" xlink:href="#fas-fa-sun"></use></svg></span><button type="button" class="consent-link" data-consent-open="">Analytics settings</button></div></footer><div id="consent-banner" role="dialog" aria-label="Analytics" data-analytics-id="G-LEY00265EM" hidden=""><p>This site can use Google Analytics to count visits. It is off until you accept, and you can change your choice in the footer.</p><div class="consent-actions"><button type="button" data-consent="denied">Decline</button> <button type="button" data-consent="granted">Accept</button></div></div><svg style="display: none;"><symbol aria-hidden="true" focusable="false" data-prefix="fab" data-icon="github" class="svg-inline--fa fa-github" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512" id="fab-fa-github"><path fill="currentColor" d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"></path></symbol></svg>
<svg style="display: none;"><symbol aria-hidden="true" focusable="false" data-prefix="fas" data-icon="square-rss" class="svg-inline--fa fa-square-rss" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512" id="fas-fa-square-rss"><path fill="currentColor" d="M64 32C28.7 32 0 60.7 0 96L0 416c0 35.3 28.7 64 64 64l320 0c35.3 0 64-28.7 64-64l0-320c0-35.3-28.7-64-64-64L64 32zM96 136c0-13.3 10.7-24 24-24c137 0 248 111 248 248c0 13.3-10.7 24-24 24s-24-10.7-24-24c0-110.5-89.5-200-200-200c-13.3 0-24-10.7-24-24zm0 96c0-13.3 10.7-24 24-24c83.9 0 152 68.1 152 152c0 13.3-10.7 24-24 24s-24-10.7-24-24c0-57.4-46.6-104-104-104c-13.3 0-24-10.7-24-24zm0 120a32 32 0 1 1 64 0 32 32 0 1 1 -64 0z"></path></symbol></svg>
<svg style="display: none;"><symbol aria-hidden="true" focusable="false" data-prefix="fas" data-icon="sun" class="svg-inline--fa fa-sun" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" id="fas-fa-sun"><path fill="currentColor" d="M361.5 1.2c5 2.1 8.6 6.6 9.6 11.9L391 121l107.9 19.8c5.3 1 9.8 4.6 11.9 9.6s1.5 10.7-1.6 15.2L446.9 256l62.3 90.3c3.1 4.5 3.7 10.2 1.6 15.2s-6.6 8.6-11.9 9.6L391 391 371.1 498.9c-1 5.3-4.6 9.8-9.6 11.9s-10.7 1.5-15.2-1.6L256 446.9l-90.3 62.3c-4.5 3.1-10.2 3.7-15.2 1.6s-8.6-6.6-9.6-11.9L121 391 13.1 371.1c-5.3-1-9.8-4.6-11.9-9.6s-1.5-10.7 1.6-15.2L65.1 256 2.8 165.7c-3.1-4.5-3.7-10.2-1.6-15.2s6.6-8.6 11.9-9.6L121 121 140.9 13.1c1-5.3 4.6-9.8 9.6-11.9s10.7-1.5 15.2 1.6L256 65.1 346.3 2.8c4.5-3.1 10.2-3.7 15.2-1.6zM160 256a96 96 0 1 1 192 0 96 96 0 1 1 -192 0zm224 0a128 128 0 1 0 -256 0 128 128 0 1 0 256 0z"></path></symbol></svg>
<svg style="display: none;"><symbol aria-hidden="true" focusable="false" data-prefix="fas" data-icon="bars" class="svg-inline--fa fa-bars" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512" id="fas-fa-bars"><path fill="currentColor" d="M0 96C0 78.3 14.3 64 32 64l384 0c17.7 0 32 14.3 32 32s-14.3 32-32 32L32 128C14.3 128 0 113.7 0 96zM0 256c0-17.7 14.3-32 32-32l384 0c17.7 0 32 14.3 32 32s-14.3 32-32 32L32 288c-17.7 0-32-14.3-32-32zM448 416c0 17.7-14.3 32-32 32L32 448c-17.7 0-32-14.3-32-32s14.3-32 32-32l384 0c17.7 0 32 14.3 32 32z"></path></symbol></svg>
<svg style="display: none;"><symbol aria-hidden="true" focusable="false" data-prefix="far" data-icon="calendar" class="svg-inline--fa fa-calendar" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512" id="far-fa-calendar"><path fill="currentColor" d="M152 24c0-13.3-10.7-24-24-24s-24 10.7-24 24l0 40L64 64C28.7 64 0 92.7 0 128l0 16 0 48L0 448c0 35.3 28.7 64 64 64l320 0c35.3 0 64-28.7 64-64l0-256 0-48 0-16c0-35.3-28.7-64-64-64l-40 0 0-40c0-13.3-10.7-24-24-24s-24 10.7-24 24l0 40L152 64l0-40zM48 192l352 0 0 256c0 8.8-7.2 16-16 16L64 464c-8.8 0-16-7.2-16-16l0-256z"></path></symbol></svg>
<svg style="display: none;"><symbol aria-hidden="true" focusable="false" data-prefix="far" data-icon="clock" class="svg-inline--fa fa-clock" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" id="far-fa-clock"><path fill="currentColor" d="M464 256A208 208 0 1 1 48 256a208 208 0 1 1 416 0zM0 256a256 256 0 1 0 512 0A256 256 0 1 0 0 256zM232 120l0 136c0 8 4 15.5 10.7 20l96 64c11 7.4 25.9 4.4 33.3-6.7s4.4-25.9-6.7-33.3L280 243.2 280 120c0-13.3-10.7-24-24-24s-24 10.7-24 24z"></path></symbol></svg>
<svg style="display: none;"><symbol aria-hidden="true" focusable="false" data-prefix="fas" data-icon="rectangle-list" class="svg-inline--fa fa-rectangle-list" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512" id="fas-fa-rectangle-list"><path fill="currentColor" d="M0 96C0 60.7 28.7 32 64 32l448 0c35.3 0 64 28.7 64 64l0 320c0 35.3-28.7 64-64 64L64 480c-35.3 0-64-28.7-64-64L0 96zM128 288a32 32 0 1 0 0-64 32 32 0 1 0 0 64zm32-128a32 32 0 1 0 -64 0 32 32 0 1 0 64 0zM128 384a32 32 0 1 0 0-64 32 32 0 1 0 0 64zm96-248c-13.3 0-24 10.7-24 24s10.7 24 24 24l224 0c13.3 0 24-10.7 24-24s-10.7-24-24-24l-224 0zm0 96c-13.3 0-24 10.7-24 24s10.7 24 24 24l224 0c13.3 0 24-10.7 24-24s-10.7-24-24-24l-224 0zm0 96c-13.3 0-24 10.7-24 24s10.7 24 24 24l224 0c13.3 0 24-10.7 24-24s-10.7-24-24-24l-224 0z"></path></symbol></svg>
<svg style="display: none;"><symbol aria-hidden="true" focusable="false" data-prefix="fas" data-icon="tags" class="svg-inline--fa fa-tags" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" id="fas-fa-tags"><path fill="currentColor" d="M345 39.1L472.8 168.4c52.4 53 52.4 138.2 0 191.2L360.8 472.9c-9.3 9.4-24.5 9.5-33.9 .2s-9.5-24.5-.2-33.9L438.6 325.9c33.9-34.3 33.9-89.4 0-123.7L310.9 72.9c-9.3-9.4-9.2-24.6 .2-33.9s24.6-9.2 33.9 .2zM0 229.5L0 80C0 53.5 21.5 32 48 32l149.5 0c17 0 33.3 6.7 45.3 18.7l168 168c25 25 25 65.5 0 90.5L277.3 442.7c-25 25-65.5 25-90.5 0l-168-168C6.7 262.7 0 246.5 0 229.5zM144 144a32 32 0 1 0 -64 0 32 32 0 1 0 64 0z"></path></symbol></svg><script defer="" type="module" src="/js/5L5VWDElNQ.js"></script></body></html>