<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="rss.xsl"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>Ali Alo — Blog Blog</title>
        <link>https://your-docusaurus-site.example.com/blog</link>
        <description>Ali Alo — Blog Blog</description>
        <lastBuildDate>Tue, 15 Sep 2026 00:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <item>
            <title><![CDATA[Entity Framework Core anti-patterns]]></title>
            <link>https://your-docusaurus-site.example.com/blog/ef-core-anti-patterns</link>
            <guid>https://your-docusaurus-site.example.com/blog/ef-core-anti-patterns</guid>
            <pubDate>Tue, 15 Sep 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Entity Framework Core is arguably one of the most popular frameworks used in .NET development. It is an Object Relational Mapper (ORM) that supports both relational and NoSQL databases.]]></description>
            <content:encoded><![CDATA[<p>Entity Framework Core is arguably one of the most popular frameworks used in .NET development. It is an Object Relational Mapper (ORM) that supports both relational and NoSQL databases.</p>
<p>In this blog, I am going to recap and explain with code the 8 most common mistakes developers make with EF Core when working with relational schemas. These anti-patterns negatively affect application performance and are often the bottleneck for application robustness.</p>
<!-- -->
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_BuS1"><p>This post is a written reference, with extra code snippets and sidenotes, of a live stream — <a href="https://www.youtube.com/live/jlR6KFuFODI?si=rJ3v2i0ZwzlTwLS4" target="_blank" rel="noopener noreferrer" class="">.NET Data Community Standup: 8 Real-World Query Anti‑Patterns (and How to Fix Them)</a> from the dotnet channel. If you have time, I encourage you to watch the full video.</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-n--1-problem">1. N + 1 Problem<a href="https://your-docusaurus-site.example.com/blog/ef-core-anti-patterns#1-n--1-problem" class="hash-link" aria-label="Direct link to 1. N + 1 Problem" title="Direct link to 1. N + 1 Problem" translate="no">​</a></h2>
<p>The list starts with one of the worst situations that can happen — the N + 1 issue. Imagine you query specific orders, and each order can have one or many products. An N + 1 query might look like the following:</p>
<div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#403f53;--prism-background-color:#FBFBFB"><div class="codeBlockTitle_OeMC">N + 1 issue with explicit loading</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar" style="color:#403f53;background-color:#FBFBFB"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#403f53"><span class="token class-name keyword" style="color:rgb(12, 150, 155)">var</span><span class="token plain"> manufacturers </span><span class="token operator" style="color:rgb(12, 150, 155)">=</span><span class="token plain"> context</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token plain">Manufacturers</span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token function" style="color:rgb(153, 76, 195);font-style:italic">Where</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token plain">m </span><span class="token operator" style="color:rgb(12, 150, 155)">=&gt;</span><span class="token plain"> m</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token plain">Country </span><span class="token operator" style="color:rgb(12, 150, 155)">==</span><span class="token plain"> Countries</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token plain">USA</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token function" style="color:rgb(153, 76, 195);font-style:italic">ToList</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token punctuation" style="color:rgb(153, 76, 195)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain"></span><span class="token keyword" style="color:rgb(12, 150, 155)">foreach</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token class-name keyword" style="color:rgb(12, 150, 155)">var</span><span class="token plain"> manufacturer </span><span class="token keyword" style="color:rgb(12, 150, 155)">in</span><span class="token plain"> manufacturers</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain"></span><span class="token punctuation" style="color:rgb(153, 76, 195)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">    Console</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token function" style="color:rgb(153, 76, 195);font-style:italic">WriteLine</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token string" style="color:rgb(72, 118, 214)">"Manufacturer: "</span><span class="token plain"> </span><span class="token operator" style="color:rgb(12, 150, 155)">+</span><span class="token plain"> manufacturer</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token plain">Name</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token punctuation" style="color:rgb(153, 76, 195)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">    </span><span class="token comment" style="color:rgb(152, 159, 177);font-style:italic">// loading all products for each manufacturer explicitly</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">    context</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token function" style="color:rgb(153, 76, 195);font-style:italic">Entry</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token plain">manufacturer</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token function" style="color:rgb(153, 76, 195);font-style:italic">Collection</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token plain">m </span><span class="token operator" style="color:rgb(12, 150, 155)">=&gt;</span><span class="token plain"> m</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token plain">Products</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token function" style="color:rgb(153, 76, 195);font-style:italic">Load</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token punctuation" style="color:rgb(153, 76, 195)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">    </span><span class="token keyword" style="color:rgb(12, 150, 155)">foreach</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token class-name keyword" style="color:rgb(12, 150, 155)">var</span><span class="token plain"> product </span><span class="token keyword" style="color:rgb(12, 150, 155)">in</span><span class="token plain"> manufacturer</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token plain">Products</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(153, 76, 195)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">        Console</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token function" style="color:rgb(153, 76, 195);font-style:italic">WriteLine</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token plain">product</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token plain">Title</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token punctuation" style="color:rgb(153, 76, 195)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(153, 76, 195)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain"></span><span class="token punctuation" style="color:rgb(153, 76, 195)">}</span><br></div></code></pre></div></div>
<p>Or, if you are using lazy loading, the query you compose may look even more innocent:</p>
<div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#403f53;--prism-background-color:#FBFBFB"><div class="codeBlockTitle_OeMC">N + 1 issue with lazy loading</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar" style="color:#403f53;background-color:#FBFBFB"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#403f53"><span class="token class-name keyword" style="color:rgb(12, 150, 155)">var</span><span class="token plain"> manufacturers </span><span class="token operator" style="color:rgb(12, 150, 155)">=</span><span class="token plain"> context</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token plain">Manufacturers</span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token function" style="color:rgb(153, 76, 195);font-style:italic">Where</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token plain">m </span><span class="token operator" style="color:rgb(12, 150, 155)">=&gt;</span><span class="token plain"> m</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token plain">Country </span><span class="token operator" style="color:rgb(12, 150, 155)">==</span><span class="token plain"> Countries</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token plain">USA</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token function" style="color:rgb(153, 76, 195);font-style:italic">ToList</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token punctuation" style="color:rgb(153, 76, 195)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain"></span><span class="token keyword" style="color:rgb(12, 150, 155)">foreach</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token class-name keyword" style="color:rgb(12, 150, 155)">var</span><span class="token plain"> manufacturer </span><span class="token keyword" style="color:rgb(12, 150, 155)">in</span><span class="token plain"> manufacturers</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain"></span><span class="token punctuation" style="color:rgb(153, 76, 195)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">    Console</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token function" style="color:rgb(153, 76, 195);font-style:italic">WriteLine</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token string" style="color:rgb(72, 118, 214)">"Manufacturer: "</span><span class="token plain"> </span><span class="token operator" style="color:rgb(12, 150, 155)">+</span><span class="token plain"> manufacturer</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token plain">Name</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token punctuation" style="color:rgb(153, 76, 195)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">    </span><span class="token keyword" style="color:rgb(12, 150, 155)">foreach</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token class-name keyword" style="color:rgb(12, 150, 155)">var</span><span class="token plain"> product </span><span class="token keyword" style="color:rgb(12, 150, 155)">in</span><span class="token plain"> manufacturer</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token plain">Products</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(153, 76, 195)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">        Console</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token function" style="color:rgb(153, 76, 195);font-style:italic">WriteLine</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token string" style="color:rgb(72, 118, 214)">"\t"</span><span class="token plain"> </span><span class="token operator" style="color:rgb(12, 150, 155)">+</span><span class="token plain"> product</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token plain">Title</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token punctuation" style="color:rgb(153, 76, 195)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(153, 76, 195)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain"></span><span class="token punctuation" style="color:rgb(153, 76, 195)">}</span><br></div></code></pre></div></div>
<p>In my sample database, I have "Apple" and "Tesla" as the only manufacturers in the US, so since we get 2 parent entities, an ORM will generate 3 queries in total. Both the explicit and lazy loading queries produce the same queries below, combined with the <code>WriteLine</code> output:</p>
<div class="language-sql codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#403f53;--prism-background-color:#FBFBFB"><div class="codeBlockTitle_OeMC">N + 1 sql query generation and WriteLine output</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sql codeBlock_bY9V thin-scrollbar" style="color:#403f53;background-color:#FBFBFB"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#403f53"><span class="token keyword" style="color:rgb(12, 150, 155)">SELECT</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">m</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">Id</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">m</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">Country</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">m</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">Name</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain"></span><span class="token keyword" style="color:rgb(12, 150, 155)">FROM</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">Manufacturers</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(12, 150, 155)">AS</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">m</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain"></span><span class="token keyword" style="color:rgb(12, 150, 155)">WHERE</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">m</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">Country</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token plain"> </span><span class="token operator" style="color:rgb(12, 150, 155)">=</span><span class="token plain"> N</span><span class="token string" style="color:rgb(72, 118, 214)">'USA'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">Manufacturer: Apple</span><br></div><div class="token-line" style="color:#403f53"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain"></span><span class="token keyword" style="color:rgb(12, 150, 155)">SELECT</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">p</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">Id</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">p</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">Description</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">p</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">ManufacturerId</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">p</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">Price</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">p</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">Title</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain"></span><span class="token keyword" style="color:rgb(12, 150, 155)">FROM</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">Products</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(12, 150, 155)">AS</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">p</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain"></span><span class="token keyword" style="color:rgb(12, 150, 155)">WHERE</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">p</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">ManufacturerId</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token plain"> </span><span class="token operator" style="color:rgb(12, 150, 155)">=</span><span class="token plain"> </span><span class="token variable" style="color:rgb(201, 103, 101)">@p</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">    iPhone </span><span class="token number" style="color:rgb(170, 9, 130)">17</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">    iPad mini </span><span class="token number" style="color:rgb(170, 9, 130)">7</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">Manufacturer: Tesla</span><br></div><div class="token-line" style="color:#403f53"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain"></span><span class="token keyword" style="color:rgb(12, 150, 155)">SELECT</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">p</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">Id</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">p</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">Description</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">p</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">ManufacturerId</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">p</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">Price</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">p</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">Title</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain"></span><span class="token keyword" style="color:rgb(12, 150, 155)">FROM</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">Products</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(12, 150, 155)">AS</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">p</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain"></span><span class="token keyword" style="color:rgb(12, 150, 155)">WHERE</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">p</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">ManufacturerId</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token plain"> </span><span class="token operator" style="color:rgb(12, 150, 155)">=</span><span class="token plain"> </span><span class="token variable" style="color:rgb(201, 103, 101)">@p</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">    Model </span><span class="token number" style="color:rgb(170, 9, 130)">3</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">    Cybertruck</span><br></div></code></pre></div></div>
<p>I only had 2 parent entities in my example, but you can already imagine how easily this could scale to more manufacturers, generating even more queries. A solution proposed was to use <code>Eager Loading</code>.</p>
<div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#403f53;--prism-background-color:#FBFBFB"><div class="codeBlockTitle_OeMC">Eager Loading approach to N + 1 problem</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar" style="color:#403f53;background-color:#FBFBFB"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#403f53"><span class="token class-name keyword" style="color:rgb(12, 150, 155)">var</span><span class="token plain"> manufacturers </span><span class="token operator" style="color:rgb(12, 150, 155)">=</span><span class="token plain"> context</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token plain">Manufacturers</span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token function" style="color:rgb(153, 76, 195);font-style:italic">Where</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token plain">m </span><span class="token operator" style="color:rgb(12, 150, 155)">=&gt;</span><span class="token plain"> m</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token plain">Country </span><span class="token operator" style="color:rgb(12, 150, 155)">==</span><span class="token plain"> Countries</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token plain">USA</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">    </span><span class="token comment" style="color:rgb(152, 159, 177);font-style:italic">// eagerly load all products</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token function" style="color:rgb(153, 76, 195);font-style:italic">Include</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token plain">m </span><span class="token operator" style="color:rgb(12, 150, 155)">=&gt;</span><span class="token plain"> m</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token plain">Products</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token function" style="color:rgb(153, 76, 195);font-style:italic">ToList</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token punctuation" style="color:rgb(153, 76, 195)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain"></span><span class="token keyword" style="color:rgb(12, 150, 155)">foreach</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token class-name keyword" style="color:rgb(12, 150, 155)">var</span><span class="token plain"> manufacturer </span><span class="token keyword" style="color:rgb(12, 150, 155)">in</span><span class="token plain"> manufacturers</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain"></span><span class="token punctuation" style="color:rgb(153, 76, 195)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">    Console</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token function" style="color:rgb(153, 76, 195);font-style:italic">WriteLine</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token string" style="color:rgb(72, 118, 214)">"Manufacturer: "</span><span class="token plain"> </span><span class="token operator" style="color:rgb(12, 150, 155)">+</span><span class="token plain"> manufacturer</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token plain">Name</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token punctuation" style="color:rgb(153, 76, 195)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">    </span><span class="token keyword" style="color:rgb(12, 150, 155)">foreach</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token class-name keyword" style="color:rgb(12, 150, 155)">var</span><span class="token plain"> product </span><span class="token keyword" style="color:rgb(12, 150, 155)">in</span><span class="token plain"> manufacturer</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token plain">Products</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(153, 76, 195)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">        Console</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token function" style="color:rgb(153, 76, 195);font-style:italic">WriteLine</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token string" style="color:rgb(72, 118, 214)">"\t"</span><span class="token plain"> </span><span class="token operator" style="color:rgb(12, 150, 155)">+</span><span class="token plain"> product</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token plain">Title</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token punctuation" style="color:rgb(153, 76, 195)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(153, 76, 195)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain"></span><span class="token punctuation" style="color:rgb(153, 76, 195)">}</span><br></div></code></pre></div></div>
<div class="language-sql codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#403f53;--prism-background-color:#FBFBFB"><div class="codeBlockTitle_OeMC">SQL generation of Eager Loading and WriteLine statements</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sql codeBlock_bY9V thin-scrollbar" style="color:#403f53;background-color:#FBFBFB"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#403f53"><span class="token keyword" style="color:rgb(12, 150, 155)">SELECT</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">m</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">Id</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">m</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">Country</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">m</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">Name</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">p</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">Id</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">p</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">Description</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">p</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">ManufacturerId</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">p</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">Price</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">p</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">Title</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain"></span><span class="token keyword" style="color:rgb(12, 150, 155)">FROM</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">Manufacturers</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(12, 150, 155)">AS</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">m</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain"></span><span class="token keyword" style="color:rgb(12, 150, 155)">LEFT</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(12, 150, 155)">JOIN</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">Products</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(12, 150, 155)">AS</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">p</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(12, 150, 155)">ON</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">m</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">Id</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token plain"> </span><span class="token operator" style="color:rgb(12, 150, 155)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">p</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">ManufacturerId</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain"></span><span class="token keyword" style="color:rgb(12, 150, 155)">WHERE</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">m</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">Country</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token plain"> </span><span class="token operator" style="color:rgb(12, 150, 155)">=</span><span class="token plain"> N</span><span class="token string" style="color:rgb(72, 118, 214)">'USA'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain"></span><span class="token keyword" style="color:rgb(12, 150, 155)">ORDER</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(12, 150, 155)">BY</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">m</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">Id</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">Manufacturer: Apple</span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">    iPhone </span><span class="token number" style="color:rgb(170, 9, 130)">17</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">    iPad mini </span><span class="token number" style="color:rgb(170, 9, 130)">7</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">Manufacturer: Tesla</span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">    Model </span><span class="token number" style="color:rgb(170, 9, 130)">3</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">    Cybertruck</span><br></div></code></pre></div></div>
<p>As we can see, this time, only one query was generated and all the related entities, which are products in this case, were loaded immediately. The <code>Include()</code> method generates a <code>JOIN</code> statement, which needs to be used cautiously or otherwise can lead to an anti-pattern number two.</p>
<p>We will also come back to this query later when we discuss <code>Projection</code>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-cartesian-explosion">2. Cartesian Explosion<a href="https://your-docusaurus-site.example.com/blog/ef-core-anti-patterns#2-cartesian-explosion" class="hash-link" aria-label="Direct link to 2. Cartesian Explosion" title="Direct link to 2. Cartesian Explosion" translate="no">​</a></h2>
<p>As mentioned previously, when we load a related entity with eager loading, EF Core is using a <code>JOIN</code> statement, hence logically, two or more <code>Include</code> calls that load collection navigations on one entity cause a Cartesian product.</p>
<div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#403f53;--prism-background-color:#FBFBFB"><div class="codeBlockTitle_OeMC">Cartesian Explosion issue</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar" style="color:#403f53;background-color:#FBFBFB"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#403f53"><span class="token class-name keyword" style="color:rgb(12, 150, 155)">var</span><span class="token plain"> manufacturers </span><span class="token operator" style="color:rgb(12, 150, 155)">=</span><span class="token plain"> context</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token plain">Manufacturers</span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token function" style="color:rgb(153, 76, 195);font-style:italic">Where</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token plain">m </span><span class="token operator" style="color:rgb(12, 150, 155)">=&gt;</span><span class="token plain"> m</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token plain">Country </span><span class="token operator" style="color:rgb(12, 150, 155)">==</span><span class="token plain"> Countries</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token plain">USA</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token function" style="color:rgb(153, 76, 195);font-style:italic">Include</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token plain">m </span><span class="token operator" style="color:rgb(12, 150, 155)">=&gt;</span><span class="token plain"> m</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token plain">Products</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token function" style="color:rgb(153, 76, 195);font-style:italic">Include</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token plain">m </span><span class="token operator" style="color:rgb(12, 150, 155)">=&gt;</span><span class="token plain"> m</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token plain">Suppliers</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token function" style="color:rgb(153, 76, 195);font-style:italic">ToList</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token punctuation" style="color:rgb(153, 76, 195)">;</span><br></div></code></pre></div></div>
<div class="language-sql codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#403f53;--prism-background-color:#FBFBFB"><div class="codeBlockTitle_OeMC">Cartesian Explosion SQL</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sql codeBlock_bY9V thin-scrollbar" style="color:#403f53;background-color:#FBFBFB"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#403f53"><span class="token keyword" style="color:rgb(12, 150, 155)">SELECT</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">m</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">Id</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">m</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">Country</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">m</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">Name</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">p</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">Id</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">p</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">Description</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">p</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">ManufacturerId</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">p</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">Price</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">p</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">Title</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">s0</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">ManufacturersId</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">s0</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">SuppliersId</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">s0</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">Id</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">s0</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">Name</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">      </span><span class="token keyword" style="color:rgb(12, 150, 155)">FROM</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">Manufacturers</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(12, 150, 155)">AS</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">m</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">      </span><span class="token keyword" style="color:rgb(12, 150, 155)">LEFT</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(12, 150, 155)">JOIN</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">Products</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(12, 150, 155)">AS</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">p</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(12, 150, 155)">ON</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">m</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">Id</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token plain"> </span><span class="token operator" style="color:rgb(12, 150, 155)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">p</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">ManufacturerId</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">      </span><span class="token keyword" style="color:rgb(12, 150, 155)">LEFT</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(12, 150, 155)">JOIN</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">          </span><span class="token keyword" style="color:rgb(12, 150, 155)">SELECT</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">m0</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">ManufacturersId</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">m0</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">SuppliersId</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">s</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">Id</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">s</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">Name</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">          </span><span class="token keyword" style="color:rgb(12, 150, 155)">FROM</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">ManufacturerSupplier</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(12, 150, 155)">AS</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">m0</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">          </span><span class="token keyword" style="color:rgb(12, 150, 155)">INNER</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(12, 150, 155)">JOIN</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">Suppliers</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(12, 150, 155)">AS</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">s</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(12, 150, 155)">ON</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">m0</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">SuppliersId</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token plain"> </span><span class="token operator" style="color:rgb(12, 150, 155)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">s</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">Id</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(12, 150, 155)">AS</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">s0</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(12, 150, 155)">ON</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">m</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">Id</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token plain"> </span><span class="token operator" style="color:rgb(12, 150, 155)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">s0</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">ManufacturersId</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">      </span><span class="token keyword" style="color:rgb(12, 150, 155)">WHERE</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">m</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">Country</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token plain"> </span><span class="token operator" style="color:rgb(12, 150, 155)">=</span><span class="token plain"> N</span><span class="token string" style="color:rgb(72, 118, 214)">'USA'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">      </span><span class="token keyword" style="color:rgb(12, 150, 155)">ORDER</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(12, 150, 155)">BY</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">m</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">Id</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">p</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">Id</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">s0</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">ManufacturersId</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">s0</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">SuppliersId</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><br></div></code></pre></div></div>
<p>The generated SQL query is a clear sign of Cartesian explosion. For example, if a manufacturer has 6 products and 3 suppliers, <code>6 x 3 = 18</code> rows will be sent over the network. If we used three joins, we would need to multiply the result count of each entity, so the total rows returned would explode — and that's where the issue gets its name: <code>Cartesian Explosion</code>.</p>
<p>EF Core proposes another approach, to use <code>AsSplitQuery()</code> method, which will generate a separate roundtrip query for each <code>Include()</code> method.</p>
<div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#403f53;--prism-background-color:#FBFBFB"><div class="codeBlockTitle_OeMC">Using AsSplitQuery() to avoid Cartesian explosion</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar" style="color:#403f53;background-color:#FBFBFB"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#403f53"><span class="token class-name keyword" style="color:rgb(12, 150, 155)">var</span><span class="token plain"> manufacturers </span><span class="token operator" style="color:rgb(12, 150, 155)">=</span><span class="token plain"> context</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token plain">Manufacturers</span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token function" style="color:rgb(153, 76, 195);font-style:italic">Where</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token plain">m </span><span class="token operator" style="color:rgb(12, 150, 155)">=&gt;</span><span class="token plain"> m</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token plain">Country </span><span class="token operator" style="color:rgb(12, 150, 155)">==</span><span class="token plain"> Countries</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token plain">USA</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token function" style="color:rgb(153, 76, 195);font-style:italic">Include</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token plain">m </span><span class="token operator" style="color:rgb(12, 150, 155)">=&gt;</span><span class="token plain"> m</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token plain">Products</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token function" style="color:rgb(153, 76, 195);font-style:italic">Include</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token plain">m </span><span class="token operator" style="color:rgb(12, 150, 155)">=&gt;</span><span class="token plain"> m</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token plain">Suppliers</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token function" style="color:rgb(153, 76, 195);font-style:italic">AsSplitQuery</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token function" style="color:rgb(153, 76, 195);font-style:italic">ToList</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token punctuation" style="color:rgb(153, 76, 195)">;</span><br></div></code></pre></div></div>
<div class="language-sql codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#403f53;--prism-background-color:#FBFBFB"><div class="codeBlockTitle_OeMC">Generated SQL when using AsSplitQuery()</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sql codeBlock_bY9V thin-scrollbar" style="color:#403f53;background-color:#FBFBFB"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#403f53"><span class="token keyword" style="color:rgb(12, 150, 155)">SELECT</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">m</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">Id</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">m</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">Country</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">m</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">Name</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain"></span><span class="token keyword" style="color:rgb(12, 150, 155)">FROM</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">Manufacturers</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(12, 150, 155)">AS</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">m</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain"></span><span class="token keyword" style="color:rgb(12, 150, 155)">WHERE</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">m</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">Country</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token plain"> </span><span class="token operator" style="color:rgb(12, 150, 155)">=</span><span class="token plain"> N</span><span class="token string" style="color:rgb(72, 118, 214)">'USA'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain"></span><span class="token keyword" style="color:rgb(12, 150, 155)">ORDER</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(12, 150, 155)">BY</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">m</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">Id</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain"></span><span class="token keyword" style="color:rgb(12, 150, 155)">SELECT</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">p</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">Id</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">p</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">Description</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">p</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">ManufacturerId</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">p</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">Price</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">p</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">Title</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">m</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">Id</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain"></span><span class="token keyword" style="color:rgb(12, 150, 155)">FROM</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">Manufacturers</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(12, 150, 155)">AS</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">m</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain"></span><span class="token keyword" style="color:rgb(12, 150, 155)">INNER</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(12, 150, 155)">JOIN</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">Products</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(12, 150, 155)">AS</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">p</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(12, 150, 155)">ON</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">m</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">Id</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token plain"> </span><span class="token operator" style="color:rgb(12, 150, 155)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">p</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">ManufacturerId</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain"></span><span class="token keyword" style="color:rgb(12, 150, 155)">WHERE</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">m</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">Country</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token plain"> </span><span class="token operator" style="color:rgb(12, 150, 155)">=</span><span class="token plain"> N</span><span class="token string" style="color:rgb(72, 118, 214)">'USA'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain"></span><span class="token keyword" style="color:rgb(12, 150, 155)">ORDER</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(12, 150, 155)">BY</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">m</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">Id</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain"></span><span class="token keyword" style="color:rgb(12, 150, 155)">SELECT</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">s0</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">ManufacturersId</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">s0</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">SuppliersId</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">s0</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">Id</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">s0</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">Name</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">m</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">Id</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain"></span><span class="token keyword" style="color:rgb(12, 150, 155)">FROM</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">Manufacturers</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(12, 150, 155)">AS</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">m</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain"></span><span class="token keyword" style="color:rgb(12, 150, 155)">INNER</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(12, 150, 155)">JOIN</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">    </span><span class="token keyword" style="color:rgb(12, 150, 155)">SELECT</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">m0</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">ManufacturersId</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">m0</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">SuppliersId</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">s</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">Id</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">s</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">Name</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">    </span><span class="token keyword" style="color:rgb(12, 150, 155)">FROM</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">ManufacturerSupplier</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(12, 150, 155)">AS</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">m0</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">    </span><span class="token keyword" style="color:rgb(12, 150, 155)">INNER</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(12, 150, 155)">JOIN</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">Suppliers</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(12, 150, 155)">AS</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">s</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(12, 150, 155)">ON</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">m0</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">SuppliersId</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token plain"> </span><span class="token operator" style="color:rgb(12, 150, 155)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">s</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">Id</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain"></span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(12, 150, 155)">AS</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">s0</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(12, 150, 155)">ON</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">m</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">Id</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token plain"> </span><span class="token operator" style="color:rgb(12, 150, 155)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">s0</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">ManufacturersId</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain"></span><span class="token keyword" style="color:rgb(12, 150, 155)">WHERE</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">m</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">Country</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token plain"> </span><span class="token operator" style="color:rgb(12, 150, 155)">=</span><span class="token plain"> N</span><span class="token string" style="color:rgb(72, 118, 214)">'USA'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain"></span><span class="token keyword" style="color:rgb(12, 150, 155)">ORDER</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(12, 150, 155)">BY</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">m</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">Id</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><br></div></code></pre></div></div>
<p>As we can see here, first a query to get all the filtered manufacturers was used, then two different queries were used, one to get related Products and another one to get related Suppliers. The query to get related suppliers uses two joins because it is a many-to-many relationship, but the overall concept is that we got rid of the problem with Cartesian products.</p>
<p>However, this approach has its own flaws, and that's why it is not the default behavior.</p>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_BuS1"><p>You can set AsSplitQuery to be your default query splitting behavior:</p><div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#403f53;--prism-background-color:#FBFBFB"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar" style="color:#403f53;background-color:#FBFBFB"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#403f53"><span class="token plain">optionsBuilder</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token function" style="color:rgb(153, 76, 195);font-style:italic">UseSqlServer</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">    connectionStringBuilder</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token plain">ConnectionString</span><span class="token punctuation" style="color:rgb(153, 76, 195)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">    options </span><span class="token operator" style="color:rgb(12, 150, 155)">=&gt;</span><span class="token plain"> options</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token function" style="color:rgb(153, 76, 195);font-style:italic">UseQuerySplittingBehavior</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token plain">QuerySplittingBehavior</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token plain">SplitQuery</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token punctuation" style="color:rgb(153, 76, 195)">;</span><br></div></code></pre></div></div><p>And if later in the application you need to send a single (Cartesian) query, you can use <code>AsSingleQuery()</code>:</p><div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#403f53;--prism-background-color:#FBFBFB"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar" style="color:#403f53;background-color:#FBFBFB"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#403f53"><span class="token class-name keyword" style="color:rgb(12, 150, 155)">var</span><span class="token plain"> manufacturers </span><span class="token operator" style="color:rgb(12, 150, 155)">=</span><span class="token plain"> context</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token plain">Manufacturers</span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token function" style="color:rgb(153, 76, 195);font-style:italic">Where</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token plain">m </span><span class="token operator" style="color:rgb(12, 150, 155)">=&gt;</span><span class="token plain"> m</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token plain">Country </span><span class="token operator" style="color:rgb(12, 150, 155)">==</span><span class="token plain"> Countries</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token plain">USA</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token function" style="color:rgb(153, 76, 195);font-style:italic">Include</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token plain">m </span><span class="token operator" style="color:rgb(12, 150, 155)">=&gt;</span><span class="token plain"> m</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token plain">Products</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token function" style="color:rgb(153, 76, 195);font-style:italic">Include</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token plain">m </span><span class="token operator" style="color:rgb(12, 150, 155)">=&gt;</span><span class="token plain"> m</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token plain">Suppliers</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token function" style="color:rgb(153, 76, 195);font-style:italic">AsSingleQuery</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token function" style="color:rgb(153, 76, 195);font-style:italic">ToList</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token punctuation" style="color:rgb(153, 76, 195)">;</span><br></div></code></pre></div></div></div></div>
<p>The reason why the split query is not the default behavior is that it creates the following issues:</p>
<ul>
<li class="">
<p>Results are not guaranteed to be consistent. Within a single query, database engines guarantee consistency; however, if the underlying data changes between your split queries, the final result may be inconsistent. It is possible to specify a transaction manually and use a stronger isolation level such as serializable, but this would impact performance and lock your database.</p>
</li>
<li class="">
<p>Multiple roundtrips are sent to the database. Network calls are often the underlying reason for slow responses, so multiple network calls can also degrade performance.</p>
</li>
</ul>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_BuS1"><p>You can see the full list at the following <a href="https://learn.microsoft.com/en-us/ef/core/querying/single-split-queries#characteristics-of-split-queries" target="_blank" rel="noopener noreferrer" class="">link</a>.</p></div></div>
<p>So in the end, both approaches have downsides. For that reason, it is sometimes worth thinking about your queries before you start designing your schema. If you frequently need to load an entity together with its related collections, a document database (such as Azure Cosmos DB or MongoDB) may be a better fit. There, the related data is usually embedded directly inside the parent document, typically stored as JSON, so a single read returns everything at once and neither a Cartesian explosion nor extra roundtrips come into play.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-requesting-more-rows-than-needed">3. Requesting more rows than needed.<a href="https://your-docusaurus-site.example.com/blog/ef-core-anti-patterns#3-requesting-more-rows-than-needed" class="hash-link" aria-label="Direct link to 3. Requesting more rows than needed." title="Direct link to 3. Requesting more rows than needed." translate="no">​</a></h2>
<p>The first two anti-patterns were not particularly specific to EF Core, but rather just how relational databases work. This anti-pattern is rather EF Core and C# expression trees specific.</p>
<p>Not everything we put into our query building process can be translated into SQL statements, for example consider the following snippet:</p>
<div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#403f53;--prism-background-color:#FBFBFB"><div class="codeBlockTitle_OeMC">Incorrectly building a query</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar" style="color:#403f53;background-color:#FBFBFB"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#403f53"><span class="token class-name keyword" style="color:rgb(12, 150, 155)">var</span><span class="token plain"> manufacturers </span><span class="token operator" style="color:rgb(12, 150, 155)">=</span><span class="token plain"> context</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token plain">Manufacturers</span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token function" style="color:rgb(153, 76, 195);font-style:italic">Where</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token plain">m </span><span class="token operator" style="color:rgb(12, 150, 155)">=&gt;</span><span class="token plain"> </span><span class="token function" style="color:rgb(153, 76, 195);font-style:italic">IsAmericanManufacturer</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token plain">m</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token function" style="color:rgb(153, 76, 195);font-style:italic">ToList</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token punctuation" style="color:rgb(153, 76, 195)">;</span><br></div></code></pre></div></div>
<div class="language-terminal codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#403f53;--prism-background-color:#FBFBFB"><div class="codeBlockTitle_OeMC">Runtime error</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-terminal codeBlock_bY9V thin-scrollbar" style="color:#403f53;background-color:#FBFBFB"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#403f53"><span class="token plain">Unhandled exception. System.InvalidOperationException: The LINQ expression 'DbSet&lt;Manufacturer&gt;()</span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">    .Where(m =&gt; Program.IsAmericanManufacturer(m))' could not be translated.</span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">    </span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">Either rewrite the query in a form that can be translated, or switch to client evaluation explicitly...</span><br></div></code></pre></div></div>
<p>It's not really "the database" that has a problem with <code>IsAmericanManufacturer</code> — it's EF Core's LINQ-to-SQL translation layer that can't turn an arbitrary C# method into a SQL fragment. It's also worth noting when this actually throws: writing <code>.Where(m =&gt; IsAmericanManufacturer(m))</code> alone doesn't throw anything, it just builds an expression tree. The exception only fires once the query is executed, i.e. once you call <code>.ToList()</code>, <code>.FirstOrDefault()</code>, or otherwise enumerate it.</p>
<p>What is interesting, is that in the past, this was not the default design the EF Core development team chose. In early versions of EF Core, this would implicitly translate this query into a client-side query, meaning for this case, all the rows would be returned from the database, and then filtering would happen inside the dotnet executable. EF Core 3 removed that automatic fallback and made it throw an exception instead, precisely to stop this anti-pattern from happening silently.</p>
<p>That said, you can still reintroduce the exact same problem today — EF Core just requires you to opt into it. If you "fix" the exception above by inserting <code>AsEnumerable()</code> before the <code>Where()</code>, you're telling EF Core to stop translating the query at that point and fall back to plain LINQ-to-Objects for everything after it:</p>
<div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#403f53;--prism-background-color:#FBFBFB"><div class="codeBlockTitle_OeMC">Reintroducing the anti-pattern with AsEnumerable()</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar" style="color:#403f53;background-color:#FBFBFB"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#403f53"><span class="token class-name keyword" style="color:rgb(12, 150, 155)">var</span><span class="token plain"> manufacturers </span><span class="token operator" style="color:rgb(12, 150, 155)">=</span><span class="token plain"> context</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token plain">Manufacturers</span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token function" style="color:rgb(153, 76, 195);font-style:italic">AsEnumerable</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token plain"> </span><span class="token comment" style="color:rgb(152, 159, 177);font-style:italic">// switches to LINQ-to-Objects from here on</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token function" style="color:rgb(153, 76, 195);font-style:italic">Where</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token plain">m </span><span class="token operator" style="color:rgb(12, 150, 155)">=&gt;</span><span class="token plain"> </span><span class="token function" style="color:rgb(153, 76, 195);font-style:italic">IsAmericanManufacturer</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token plain">m</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token function" style="color:rgb(153, 76, 195);font-style:italic">ToList</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token punctuation" style="color:rgb(153, 76, 195)">;</span><br></div></code></pre></div></div>
<p><code>AsEnumerable()</code> itself doesn't trigger a database call — it's just a compile-time switch from <code>IQueryable</code> to <code>IEnumerable</code>, the actual round-trip still only happens once <code>.ToList()</code> runs. But because the filter now lives after that switch, EF Core has nothing left to put in a <code>WHERE</code> clause, so the entire <code>Manufacturers</code> table gets pulled over the network before any filtering happens:</p>
<div class="language-sql codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#403f53;--prism-background-color:#FBFBFB"><div class="codeBlockTitle_OeMC">SQL generated with AsEnumerable()</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sql codeBlock_bY9V thin-scrollbar" style="color:#403f53;background-color:#FBFBFB"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#403f53"><span class="token keyword" style="color:rgb(12, 150, 155)">SELECT</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">m</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">Id</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">m</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">Country</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">m</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">Name</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain"></span><span class="token keyword" style="color:rgb(12, 150, 155)">FROM</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">Manufacturers</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(12, 150, 155)">AS</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">m</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><br></div></code></pre></div></div>
<p>This is the anti-pattern this section is named after: requesting, and transferring, more rows than the application actually needs, then throwing most of them away in memory.</p>
<p>Obviously, the takeaway from this anti-pattern is to try to always maximize filtering on the database level and keep network calls as light as possible, unless your application has an intended need for client-side filtering or pagination, like a grid component, for example.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-not-using-projection">4. Not using projection<a href="https://your-docusaurus-site.example.com/blog/ef-core-anti-patterns#4-not-using-projection" class="hash-link" aria-label="Direct link to 4. Not using projection" title="Direct link to 4. Not using projection" translate="no">​</a></h2>
<p>It's fairly common for an entity to contain more data (or columns, in this context) than a particular method or API client actually needs. For this reason, it's more efficient to avoid requesting all of an entity's data and use projection instead. Going back to the first code snippet, we can use a projection to get back only the product titles.</p>
<div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#403f53;--prism-background-color:#FBFBFB"><div class="codeBlockTitle_OeMC">Projecting with the SelectMany method</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar" style="color:#403f53;background-color:#FBFBFB"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#403f53"><span class="token class-name keyword" style="color:rgb(12, 150, 155)">var</span><span class="token plain"> productTitles </span><span class="token operator" style="color:rgb(12, 150, 155)">=</span><span class="token plain"> context</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token plain">Manufacturers</span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token function" style="color:rgb(153, 76, 195);font-style:italic">Where</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token plain">m </span><span class="token operator" style="color:rgb(12, 150, 155)">=&gt;</span><span class="token plain"> m</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token plain">Country </span><span class="token operator" style="color:rgb(12, 150, 155)">==</span><span class="token plain"> Countries</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token plain">USA</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token function" style="color:rgb(153, 76, 195);font-style:italic">SelectMany</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token plain">m </span><span class="token operator" style="color:rgb(12, 150, 155)">=&gt;</span><span class="token plain"> m</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token plain">Products</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token function" style="color:rgb(153, 76, 195);font-style:italic">Select</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token plain">p </span><span class="token operator" style="color:rgb(12, 150, 155)">=&gt;</span><span class="token plain"> p</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token plain">Title</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token function" style="color:rgb(153, 76, 195);font-style:italic">ToList</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token punctuation" style="color:rgb(153, 76, 195)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain"></span><span class="token keyword" style="color:rgb(12, 150, 155)">foreach</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token class-name keyword" style="color:rgb(12, 150, 155)">var</span><span class="token plain"> productTitle </span><span class="token keyword" style="color:rgb(12, 150, 155)">in</span><span class="token plain"> productTitles</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain"></span><span class="token punctuation" style="color:rgb(153, 76, 195)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">    Console</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token function" style="color:rgb(153, 76, 195);font-style:italic">WriteLine</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token plain">productTitle</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token punctuation" style="color:rgb(153, 76, 195)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain"></span><span class="token punctuation" style="color:rgb(153, 76, 195)">}</span><br></div></code></pre></div></div>
<div class="language-sql codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#403f53;--prism-background-color:#FBFBFB"><div class="codeBlockTitle_OeMC">Projection query generation and WriteLine output</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sql codeBlock_bY9V thin-scrollbar" style="color:#403f53;background-color:#FBFBFB"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#403f53"><span class="token keyword" style="color:rgb(12, 150, 155)">SELECT</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">p</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">Title</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain"></span><span class="token keyword" style="color:rgb(12, 150, 155)">FROM</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">Manufacturers</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(12, 150, 155)">AS</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">m</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain"></span><span class="token keyword" style="color:rgb(12, 150, 155)">INNER</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(12, 150, 155)">JOIN</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">Products</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(12, 150, 155)">AS</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">p</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(12, 150, 155)">ON</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">m</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">Id</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token plain"> </span><span class="token operator" style="color:rgb(12, 150, 155)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">p</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">ManufacturerId</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain"></span><span class="token keyword" style="color:rgb(12, 150, 155)">WHERE</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">m</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">Country</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token plain"> </span><span class="token operator" style="color:rgb(12, 150, 155)">=</span><span class="token plain"> N</span><span class="token string" style="color:rgb(72, 118, 214)">'USA'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">iPhone </span><span class="token number" style="color:rgb(170, 9, 130)">17</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">iPad mini </span><span class="token number" style="color:rgb(170, 9, 130)">7</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">Model </span><span class="token number" style="color:rgb(170, 9, 130)">3</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">Cybertruck</span><br></div></code></pre></div></div>
<p>With this projection, only one column is returned in the result set, making the query more efficient. It's also worth noting that with projection, we don't need to explicitly load related entities — they're loaded automatically as part of the same query.</p>
<p>An important point to note here, though, is that EF Core's change tracker only tracks entities that come back from a query as the full entity type. Our projection returns plain strings, not <code>Manufacturer</code> or <code>Product</code> instances, so there's nothing for EF Core to track. That means we can't just modify <code>productTitles</code> in memory and call <code>SaveChanges()</code> to persist the change — there's no tracked entity for EF Core to compare against. For this situation, we can use the <code>ExecuteUpdate</code> method (added in EF Core 7), which is called directly on the query — not on an already-projected result — and translates straight into a SQL <code>UPDATE</code> statement without loading or tracking any entities. It runs immediately and skips <code>SaveChanges()</code> entirely, giving us the best of both worlds: an efficient read and an efficient update.</p>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_BuS1"><p>You can read an interesting documentation paragraph about EF Core tracking with custom projections at the following <a href="https://learn.microsoft.com/en-us/ef/core/querying/tracking#tracking-and-custom-projections" target="_blank" rel="noopener noreferrer" class="">link</a>.</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="5-missing-pagination-or-not-using-keyset-pagination">5. Missing pagination or not using keyset pagination<a href="https://your-docusaurus-site.example.com/blog/ef-core-anti-patterns#5-missing-pagination-or-not-using-keyset-pagination" class="hash-link" aria-label="Direct link to 5. Missing pagination or not using keyset pagination" title="Direct link to 5. Missing pagination or not using keyset pagination" translate="no">​</a></h2>
<p>Normally, we do not want to return all the data, and instead return it in the form of "pages". For instance, say the page size is 20 items, and we need page 3. A query of this type would look like this:</p>
<div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#403f53;--prism-background-color:#FBFBFB"><div class="codeBlockTitle_OeMC">A common offset pagination</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar" style="color:#403f53;background-color:#FBFBFB"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#403f53"><span class="token class-name keyword" style="color:rgb(12, 150, 155)">var</span><span class="token plain"> page </span><span class="token operator" style="color:rgb(12, 150, 155)">=</span><span class="token plain"> </span><span class="token number" style="color:rgb(170, 9, 130)">3</span><span class="token punctuation" style="color:rgb(153, 76, 195)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain"></span><span class="token class-name keyword" style="color:rgb(12, 150, 155)">var</span><span class="token plain"> pageSize </span><span class="token operator" style="color:rgb(12, 150, 155)">=</span><span class="token plain"> </span><span class="token number" style="color:rgb(170, 9, 130)">20</span><span class="token punctuation" style="color:rgb(153, 76, 195)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain"></span><span class="token class-name keyword" style="color:rgb(12, 150, 155)">var</span><span class="token plain"> toSkip </span><span class="token operator" style="color:rgb(12, 150, 155)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token plain">page </span><span class="token operator" style="color:rgb(12, 150, 155)">-</span><span class="token plain"> </span><span class="token number" style="color:rgb(170, 9, 130)">1</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token plain"> </span><span class="token operator" style="color:rgb(12, 150, 155)">*</span><span class="token plain"> pageSize</span><span class="token punctuation" style="color:rgb(153, 76, 195)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain"></span><span class="token class-name keyword" style="color:rgb(12, 150, 155)">var</span><span class="token plain"> products </span><span class="token operator" style="color:rgb(12, 150, 155)">=</span><span class="token plain"> context</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token plain">Products</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token function" style="color:rgb(153, 76, 195);font-style:italic">OrderBy</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token plain">p </span><span class="token operator" style="color:rgb(12, 150, 155)">=&gt;</span><span class="token plain"> p</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token plain">Id</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token function" style="color:rgb(153, 76, 195);font-style:italic">Skip</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token plain">toSkip</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token function" style="color:rgb(153, 76, 195);font-style:italic">Take</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token plain">pageSize</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token function" style="color:rgb(153, 76, 195);font-style:italic">ToList</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token punctuation" style="color:rgb(153, 76, 195)">;</span><br></div></code></pre></div></div>
<div class="language-sql codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#403f53;--prism-background-color:#FBFBFB"><div class="codeBlockTitle_OeMC">Query generated with offset pagination</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sql codeBlock_bY9V thin-scrollbar" style="color:#403f53;background-color:#FBFBFB"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#403f53"><span class="token keyword" style="color:rgb(12, 150, 155)">SELECT</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">p</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">Id</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">p</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">Description</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">p</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">ManufacturerId</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">p</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">Price</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">p</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">Title</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain"></span><span class="token keyword" style="color:rgb(12, 150, 155)">FROM</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">Products</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(12, 150, 155)">AS</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">p</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain"></span><span class="token keyword" style="color:rgb(12, 150, 155)">ORDER</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(12, 150, 155)">BY</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">p</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">Id</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain"></span><span class="token keyword" style="color:rgb(12, 150, 155)">OFFSET</span><span class="token plain"> </span><span class="token variable" style="color:rgb(201, 103, 101)">@p</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(12, 150, 155)">ROWS</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(12, 150, 155)">FETCH</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(12, 150, 155)">NEXT</span><span class="token plain"> </span><span class="token variable" style="color:rgb(201, 103, 101)">@p1</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(12, 150, 155)">ROWS</span><span class="token plain"> ONLY</span><br></div></code></pre></div></div>
<p>This type of pagination is called <code>Offset pagination</code>. It's called this way because it normally requires an <code>OFFSET</code> keyword to be used. This approach, however, has two main drawbacks:</p>
<ul>
<li class="">
<p><em>Inefficiency</em> — the database engine has to scan through and discard many records, making this pagination more and more inefficient as the skip amount grows.</p>
</li>
<li class="">
<p><em>Inconsistency</em> — if you showed a user page 2, and in the meantime one record was deleted, later when requesting the page 3, the user would not see one record, because <code>OFFSET</code> would skip it (given, of course, that the deleted record was either in page 1 or page 2).</p>
</li>
</ul>
<p>For this reason, a much better approach is to use a <code>Keyset pagination</code>.</p>
<p>This approach substitutes the <code>Skip</code> method with the <code>Where</code> method. A keyset pagination may look like this:</p>
<div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#403f53;--prism-background-color:#FBFBFB"><div class="codeBlockTitle_OeMC">Keyset pagination</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar" style="color:#403f53;background-color:#FBFBFB"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#403f53"><span class="token class-name keyword" style="color:rgb(12, 150, 155)">var</span><span class="token plain"> lastIdShown </span><span class="token operator" style="color:rgb(12, 150, 155)">=</span><span class="token plain"> </span><span class="token number" style="color:rgb(170, 9, 130)">72</span><span class="token punctuation" style="color:rgb(153, 76, 195)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain"></span><span class="token class-name keyword" style="color:rgb(12, 150, 155)">var</span><span class="token plain"> pageSize </span><span class="token operator" style="color:rgb(12, 150, 155)">=</span><span class="token plain"> </span><span class="token number" style="color:rgb(170, 9, 130)">20</span><span class="token punctuation" style="color:rgb(153, 76, 195)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain"></span><span class="token class-name keyword" style="color:rgb(12, 150, 155)">var</span><span class="token plain"> products </span><span class="token operator" style="color:rgb(12, 150, 155)">=</span><span class="token plain"> context</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token plain">Products</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token function" style="color:rgb(153, 76, 195);font-style:italic">OrderBy</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token plain">p </span><span class="token operator" style="color:rgb(12, 150, 155)">=&gt;</span><span class="token plain"> p</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token plain">Id</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token function" style="color:rgb(153, 76, 195);font-style:italic">Where</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token plain">p </span><span class="token operator" style="color:rgb(12, 150, 155)">=&gt;</span><span class="token plain"> p</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token plain">Id </span><span class="token operator" style="color:rgb(12, 150, 155)">&gt;</span><span class="token plain"> lastIdShown</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token function" style="color:rgb(153, 76, 195);font-style:italic">Take</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token plain">pageSize</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token function" style="color:rgb(153, 76, 195);font-style:italic">ToList</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token punctuation" style="color:rgb(153, 76, 195)">;</span><br></div></code></pre></div></div>
<div class="language-sql codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#403f53;--prism-background-color:#FBFBFB"><div class="codeBlockTitle_OeMC">Query generated with keyset pagination</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sql codeBlock_bY9V thin-scrollbar" style="color:#403f53;background-color:#FBFBFB"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#403f53"><span class="token keyword" style="color:rgb(12, 150, 155)">SELECT</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(12, 150, 155)">TOP</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token variable" style="color:rgb(201, 103, 101)">@p</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">p</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">Id</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">p</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">Description</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">p</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">ManufacturerId</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">p</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">Price</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">p</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">Title</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain"></span><span class="token keyword" style="color:rgb(12, 150, 155)">FROM</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">Products</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(12, 150, 155)">AS</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">p</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain"></span><span class="token keyword" style="color:rgb(12, 150, 155)">WHERE</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">p</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">Id</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token plain"> </span><span class="token operator" style="color:rgb(12, 150, 155)">&gt;</span><span class="token plain"> </span><span class="token variable" style="color:rgb(201, 103, 101)">@lastIdShown</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain"></span><span class="token keyword" style="color:rgb(12, 150, 155)">ORDER</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(12, 150, 155)">BY</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">p</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain">Id</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><br></div></code></pre></div></div>
<p>This implementation solves both issues. The query becomes resistant to any concurrent changes, and the database engine no longer has to scan through and discard rows to reach the requested page.</p>
<p>The only change in implementation is that now you need to know the last record the user saw, instead of the page number they are requesting.</p>
<p>One trade-off worth knowing, though: because there's no offset to compute from, keyset pagination can't jump straight to an arbitrary page — you can only move to the next (or previous) batch relative to a known cursor.</p>
<p>From the online documentation shared in the live demo, this approach can be used to support both jumping to an arbitrary page and efficient cursor-like advancements.</p>
<blockquote>
<p><em>If random access pagination is necessary, a robust implementation could use keyset pagination when navigating to the next/previous page, and offset navigation when jumping to any other page.</em></p>
<p>— <cite><a href="https://learn.microsoft.com/en-us/ef/core/querying/pagination#keyset-pagination" target="_blank" rel="noopener noreferrer" class="">Microsoft EF Core documentation</a></cite></p>
</blockquote>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="6-not-using-async-methods">6. Not using Async methods<a href="https://your-docusaurus-site.example.com/blog/ef-core-anti-patterns#6-not-using-async-methods" class="hash-link" aria-label="Direct link to 6. Not using Async methods" title="Direct link to 6. Not using Async methods" translate="no">​</a></h2>
<p>This is a very straightforward and simple anti-pattern. It means using asynchronous methods in EF Core instead of their synchronous counterparts. For example, prefer <code>ToListAsync()</code> over <code>ToList()</code>, prefer <code>SaveChangesAsync()</code> over <code>SaveChanges()</code>, etc.</p>
<div class="theme-admonition theme-admonition-important admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>important</div><div class="admonitionContent_BuS1"><p>Some SDKs, like Cosmos, don't even provide synchronous APIs for database network calls. For that reason, starting from EF Core 9 synchronous over asynchronous (sync-over-async) operations throw an exception to avoid deadlocks.</p><div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#403f53;--prism-background-color:#FBFBFB"><div class="codeBlockTitle_OeMC">Synchronously saving changes on Cosmos context</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar" style="color:#403f53;background-color:#FBFBFB"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#403f53"><span class="token plain">cosmosContext</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token function" style="color:rgb(153, 76, 195);font-style:italic">SaveChanges</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token punctuation" style="color:rgb(153, 76, 195)">;</span><br></div></code></pre></div></div><div class="language-terminal codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#403f53;--prism-background-color:#FBFBFB"><div class="codeBlockTitle_OeMC">Exception when synchronously saving changes</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-terminal codeBlock_bY9V thin-scrollbar" style="color:#403f53;background-color:#FBFBFB"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#403f53"><span class="token plain">System.InvalidOperationException: An error was generated for warning 'Microsoft.EntityFrameworkCore.Database.SyncNotSupported':</span><br></div><div class="token-line" style="color:#403f53"><span class="token plain"> Azure Cosmos DB does not support synchronous I/O. Make sure to use and correctly await only </span><br></div><div class="token-line" style="color:#403f53"><span class="token plain"> async methods when using Entity Framework Core to access Azure Cosmos DB.</span><br></div></code></pre></div></div><p>Lastly, EF Core 11 removes the last opt-out for this — today you can still suppress the exception and fall back to sync-over-async via <code>ConfigureWarnings</code>, but EF Core 11 removes that escape hatch entirely, so calls to the synchronous API against Cosmos will always throw. <a href="https://github.com/dotnet/efcore/issues/37059" target="_blank" rel="noopener noreferrer" class="">GitHub issue</a></p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="7-tracking-read-only-results">7. Tracking read-only results<a href="https://your-docusaurus-site.example.com/blog/ef-core-anti-patterns#7-tracking-read-only-results" class="hash-link" aria-label="Direct link to 7. Tracking read-only results" title="Direct link to 7. Tracking read-only results" translate="no">​</a></h2>
<p>When we query a database, by default EF Core tracks the returned entities, unless <a href="https://learn.microsoft.com/en-us/ef/core/querying/tracking#tracking-and-custom-projections" target="_blank" rel="noopener noreferrer" class="">certain rules around custom projections</a> apply — which, as we saw in anti-pattern 4, is why projected results aren't tracked in the first place. Tracking means that for every entity returned, EF Core takes a snapshot of its original state and adds it to an internal identity map, so that later, when <code>SaveChanges()</code> is called, it can compare the current values against that snapshot and figure out what actually changed.</p>
<p>That bookkeeping isn't free — it costs extra memory and CPU time. If we're only reading data and have no intention of ever modifying it, for example when returning it straight into an API response, we're paying for a feature we'll never use.</p>
<div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#403f53;--prism-background-color:#FBFBFB"><div class="codeBlockTitle_OeMC">Tracked query with no intention of ever calling SaveChanges()</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar" style="color:#403f53;background-color:#FBFBFB"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#403f53"><span class="token class-name keyword" style="color:rgb(12, 150, 155)">var</span><span class="token plain"> manufacturers </span><span class="token operator" style="color:rgb(12, 150, 155)">=</span><span class="token plain"> context</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token plain">Manufacturers</span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token function" style="color:rgb(153, 76, 195);font-style:italic">Where</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token plain">m </span><span class="token operator" style="color:rgb(12, 150, 155)">=&gt;</span><span class="token plain"> m</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token plain">Country </span><span class="token operator" style="color:rgb(12, 150, 155)">==</span><span class="token plain"> Countries</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token plain">USA</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token function" style="color:rgb(153, 76, 195);font-style:italic">ToList</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token punctuation" style="color:rgb(153, 76, 195)">;</span><br></div></code></pre></div></div>
<p>To avoid this, EF Core lets us opt out of tracking with <code>AsNoTracking()</code>:</p>
<div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#403f53;--prism-background-color:#FBFBFB"><div class="codeBlockTitle_OeMC">Opting out of tracking with AsNoTracking()</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar" style="color:#403f53;background-color:#FBFBFB"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#403f53"><span class="token class-name keyword" style="color:rgb(12, 150, 155)">var</span><span class="token plain"> manufacturers </span><span class="token operator" style="color:rgb(12, 150, 155)">=</span><span class="token plain"> context</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token plain">Manufacturers</span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token function" style="color:rgb(153, 76, 195);font-style:italic">Where</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token plain">m </span><span class="token operator" style="color:rgb(12, 150, 155)">=&gt;</span><span class="token plain"> m</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token plain">Country </span><span class="token operator" style="color:rgb(12, 150, 155)">==</span><span class="token plain"> Countries</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token plain">USA</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token function" style="color:rgb(153, 76, 195);font-style:italic">AsNoTracking</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token function" style="color:rgb(153, 76, 195);font-style:italic">ToList</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token punctuation" style="color:rgb(153, 76, 195)">;</span><br></div></code></pre></div></div>
<p>The SQL generated is exactly the same in both cases — <code>AsNoTracking()</code> doesn't change what's requested from the database, only what EF Core does with the results once they arrive. On read-heavy paths returning a lot of entities, skipping the snapshotting and identity map can meaningfully cut down both memory usage and query time.</p>
<p>If an entire <code>DbContext</code> is only ever used for reads — a dedicated reporting or query context, for instance — it's also possible to make no-tracking the default behavior for every query issued through it, instead of adding <code>AsNoTracking()</code> everywhere:</p>
<div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#403f53;--prism-background-color:#FBFBFB"><div class="codeBlockTitle_OeMC">Setting NoTracking as the default behavior for a context</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar" style="color:#403f53;background-color:#FBFBFB"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#403f53"><span class="token plain">context</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token plain">ChangeTracker</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token plain">QueryTrackingBehavior </span><span class="token operator" style="color:rgb(12, 150, 155)">=</span><span class="token plain"> QueryTrackingBehavior</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token plain">NoTracking</span><span class="token punctuation" style="color:rgb(153, 76, 195)">;</span><br></div></code></pre></div></div>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_BuS1"><p>If the same entity appears more than once in a result set — for example when it's reached through multiple join paths — <code>AsNoTracking()</code> will materialize a separate object instance for each occurrence, since there's no identity map left to deduplicate them. When you still want a single shared instance per entity but don't need change tracking, use <code>AsNoTrackingWithIdentityResolution()</code> instead. It skips the change-tracking snapshots but keeps a lightweight identity map around just for deduplication.</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="8-not-using-indexes">8. Not using Indexes<a href="https://your-docusaurus-site.example.com/blog/ef-core-anti-patterns#8-not-using-indexes" class="hash-link" aria-label="Direct link to 8. Not using Indexes" title="Direct link to 8. Not using Indexes" translate="no">​</a></h2>
<p>The final anti-pattern that was brought up touches one of the most popular relational database optimization concepts — using indexes. If you expect to often query by certain columns (or a single column), then consider adding indexes on those columns. The word "often" might be too vague, but think of it as something that is on the hot path or executed regularly. "Query by" here isn't only the <code>WHERE</code> clause — columns you <code>JOIN</code> on or <code>ORDER BY</code> benefit from an index too.</p>
<p>It's worth knowing that EF Core already creates some indexes for you: by convention, it adds an index for every foreign key (and for the columns behind an alternate key). It does not, however, index anything else automatically — regular query columns are still up to you.</p>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_BuS1"><p>EF Core has good support for different indexes. You can read more about it <a href="https://learn.microsoft.com/en-us/ef/core/modeling/indexes" target="_blank" rel="noopener noreferrer" class="">here</a>.</p></div></div>
<p>On the other hand, data that is only used for a report that runs once a week or once a month generally shouldn't be a candidate for a new index. This is because indexes come with their own cost. They take up extra disk space, since the indexed column values are stored separately, and they slow down writes, because every insert or delete — and every update to an indexed column — now also has to keep the index in sync.</p>
<p>Frequency isn't the only thing to weigh, though. Even on a hot path, an index can be a bad trade if it doesn't help the query planner narrow things down much. A column with very few distinct values — a boolean flag, a status with three options — is a classic example: a query filtering on it still matches a large share of the table, so the database often decides a full scan is cheaper than bouncing between the index and the table, and the index just sits there adding write overhead. Tiny tables fall into the same bucket — if the whole thing fits in a page or two, scanning it is already fast and an index doesn't bring any value.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="summary-and-recommendations">Summary and recommendations<a href="https://your-docusaurus-site.example.com/blog/ef-core-anti-patterns#summary-and-recommendations" class="hash-link" aria-label="Direct link to Summary and recommendations" title="Direct link to Summary and recommendations" translate="no">​</a></h2>
<p>This was a written summary — with a few additions of my own — of the <em>.NET Data Community Standup: 8 Real-World Query Anti‑Patterns (and How to Fix Them)</em>.</p>
<p>I found it genuinely useful, and that is why I decided to turn it into a blog post. I still encourage you to watch the original video as well — it has no slides, so it works just as well as a podcast if you would rather listen than watch.</p>
<p>I also always enjoy Shay Rojansky's participation and comments in these standups. He is one of my favourite contributors to dotnet, and he has a real talent for explaining things clearly. So if you have time and want to stay sharp, consider watching other stand ups where he participates.</p>]]></content:encoded>
            <category>Dotnet</category>
            <category>Entity Framework Core</category>
        </item>
        <item>
            <title><![CDATA[Getting started with multithreading code]]></title>
            <link>https://your-docusaurus-site.example.com/blog/getting-started-with-multithreading-code</link>
            <guid>https://your-docusaurus-site.example.com/blog/getting-started-with-multithreading-code</guid>
            <pubDate>Mon, 10 Aug 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Modern applications perform several tasks at a time, and using only one thread would significantly slow down the system. In many applications, this would often mean that only one user could perform an action at a time. Luckily, in .NET we can easily utilize several threads and make our applications more robust.]]></description>
            <content:encoded><![CDATA[<p>Modern applications perform several tasks at a time, and using only one thread would significantly slow down the system. In many applications, this would often mean that only one user could perform an action at a time. Luckily, in .NET we can easily utilize several threads and make our applications more robust.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="threads--processes-overview">Threads &amp; Processes Overview<a href="https://your-docusaurus-site.example.com/blog/getting-started-with-multithreading-code#threads--processes-overview" class="hash-link" aria-label="Direct link to Threads &amp; Processes Overview" title="Direct link to Threads &amp; Processes Overview" translate="no">​</a></h2>
<p>Before diving into code, it is important to have the basics down. When you execute an application, the OS starts a new process, and it is inside this process that threads are created and destroyed.</p>
<p><img decoding="async" loading="lazy" alt="OS, process, and threads diagram" src="https://your-docusaurus-site.example.com/assets/images/os-processes-and-threads-dark-9e7347e0dc010c66c8ce44fe2378a741.png#gh-dark-mode-only" width="1766" height="1440" class="img_ev3q">
<img decoding="async" loading="lazy" alt="OS, process, and threads diagram" src="https://your-docusaurus-site.example.com/assets/images/os-processes-and-threads-light-dcefc17e04ca5aace499bd672dd4910b.png#gh-light-mode-only" title="Threads and Processes diagram" width="1766" height="1440" class="img_ev3q"></p>
<p>A thread is essentially a set of instructions that a CPU can process. Normally, one CPU core can process one thread at a time, which might give the impression that computers would be very slow, since most CPUs have only, say, 8 to 16 cores. It is thanks to the thread scheduler that computers can run far more threads than they have cores by rapidly switching between them.</p>
<p>This switching is possible because a CPU executes clock cycles extremely fast — this is what the <code>GHz (gigahertz)</code> measurement stands for, or more technically, clock cycles per second. So a CPU running at 3.2 GHz is capable of running 3 billion 200 million clock cycles per second. Note that this is not the same as how often the CPU switches between threads: a context switch (swapping which thread is running on a core) is a relatively expensive operation handled by the OS, and typically happens on the order of thousands of times per second, not billions.</p>
<p>However, do not be tempted to create thousands of threads in each of your applications and think your application will be faster. Each new thread comes with an extra cost: its own stack, synchronization overhead, and the need for thread-safe code.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="using-threads-in-c">Using Threads in C#<a href="https://your-docusaurus-site.example.com/blog/getting-started-with-multithreading-code#using-threads-in-c" class="hash-link" aria-label="Direct link to Using Threads in C#" title="Direct link to Using Threads in C#" translate="no">​</a></h2>
<p>Once the application is started, there is always one <code>main thread</code> that executes the <code>Main</code> method. In typical GUI applications such as Windows Forms, this thread also represents the UI. Hence, if this thread is busy executing a long-running process, the application is not responsive, and users cannot interact with it.</p>
<p>To avoid this issue, we need to delegate longer tasks to another thread and free the main thread as soon as possible. There are several ways a new thread can be created, but in this introductory article we use the <code>Thread</code> class. It is the lowest-level interaction with threads between a process and the OS in the .NET ecosystem, and threads created this way are not managed by the <code>ThreadPool</code>.</p>
<div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#403f53;--prism-background-color:#FBFBFB"><div class="codeBlockTitle_OeMC">Program.cs</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar" style="color:#403f53;background-color:#FBFBFB"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#403f53"><span class="token class-name keyword" style="color:rgb(12, 150, 155)">var</span><span class="token plain"> newThread </span><span class="token operator" style="color:rgb(12, 150, 155)">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(12, 150, 155)">new</span><span class="token plain"> </span><span class="token constructor-invocation class-name" style="color:rgb(17, 17, 17)">Thread</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token plain"> </span><span class="token operator" style="color:rgb(12, 150, 155)">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">    </span><span class="token comment" style="color:rgb(152, 159, 177);font-style:italic">// imitate some long-running task, for example a complex pdf generation.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">    Thread</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token function" style="color:rgb(153, 76, 195);font-style:italic">Sleep</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token number" style="color:rgb(170, 9, 130)">4000</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token punctuation" style="color:rgb(153, 76, 195)">;</span><span class="token plain">    </span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">    </span><span class="token function" style="color:rgb(153, 76, 195);font-style:italic">PrintMessage</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token string" style="color:rgb(72, 118, 214)">"Generated PDF"</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token punctuation" style="color:rgb(153, 76, 195)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain"></span><span class="token punctuation" style="color:rgb(153, 76, 195)">}</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token punctuation" style="color:rgb(153, 76, 195)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain"></span><span class="token function" style="color:rgb(153, 76, 195);font-style:italic">PrintMessage</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token string" style="color:rgb(72, 118, 214)">"Before calling a method 'Start'"</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token punctuation" style="color:rgb(153, 76, 195)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">newThread</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token function" style="color:rgb(153, 76, 195);font-style:italic">Start</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token punctuation" style="color:rgb(153, 76, 195)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain"></span><span class="token function" style="color:rgb(153, 76, 195);font-style:italic">PrintMessage</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token interpolation-string string" style="color:rgb(72, 118, 214)">$"After calling a method 'Start'"</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token punctuation" style="color:rgb(153, 76, 195)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain"></span><span class="token return-type class-name keyword" style="color:rgb(12, 150, 155)">void</span><span class="token plain"> </span><span class="token function" style="color:rgb(153, 76, 195);font-style:italic">PrintMessage</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token class-name keyword" style="color:rgb(12, 150, 155)">string</span><span class="token plain"> message</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token plain"> </span><span class="token operator" style="color:rgb(12, 150, 155)">=&gt;</span><span class="token plain"> </span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">    Console</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token function" style="color:rgb(153, 76, 195);font-style:italic">WriteLine</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token interpolation-string string" style="color:rgb(72, 118, 214)">$"ThreadId is </span><span class="token interpolation-string interpolation punctuation" style="color:rgb(153, 76, 195)">{</span><span class="token interpolation-string interpolation expression language-csharp">Thread</span><span class="token interpolation-string interpolation expression language-csharp punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token interpolation-string interpolation expression language-csharp">CurrentThread</span><span class="token interpolation-string interpolation expression language-csharp punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token interpolation-string interpolation expression language-csharp">ManagedThreadId</span><span class="token interpolation-string interpolation punctuation" style="color:rgb(153, 76, 195)">}</span><span class="token interpolation-string string" style="color:rgb(72, 118, 214)">. </span><span class="token interpolation-string interpolation punctuation" style="color:rgb(153, 76, 195)">{</span><span class="token interpolation-string interpolation expression language-csharp">message</span><span class="token interpolation-string interpolation punctuation" style="color:rgb(153, 76, 195)">}</span><span class="token interpolation-string string" style="color:rgb(72, 118, 214)">"</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token punctuation" style="color:rgb(153, 76, 195)">;</span><br></div></code></pre></div></div>
<div class="language-terminal codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#403f53;--prism-background-color:#FBFBFB"><div class="codeBlockTitle_OeMC">Output</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-terminal codeBlock_bY9V thin-scrollbar" style="color:#403f53;background-color:#FBFBFB"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#403f53"><span class="token plain">ThreadId is 1. Before calling a method 'Start'</span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">ThreadId is 1. After calling a method 'Start'</span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">ThreadId is 4. Generated PDF</span><br></div><div class="token-line" style="color:#403f53"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">Process finished with exit code 0.</span><br></div></code></pre></div></div>
<p>In the example above, we created a new thread by using the <code>Thread</code> class constructor, which takes a <code>ThreadStart</code> delegate as a parameter. Then, we need to call its <code>Start</code> method to begin execution. The program completes a long-running operation and finishes.</p>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_BuS1"><p>The <code>ThreadStart</code> delegate is essentially the same as <code>Action</code>. It just so happens that the <code>Action</code> and <code>Func</code> delegate signatures were introduced after the initial version of C#.</p></div></div>
<p>From the output, we can observe that the application's main thread only calls the <code>newThread.Start</code> method, and it is another thread that handles the long-running process.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="thread-properties">Thread properties<a href="https://your-docusaurus-site.example.com/blog/getting-started-with-multithreading-code#thread-properties" class="hash-link" aria-label="Direct link to Thread properties" title="Direct link to Thread properties" translate="no">​</a></h2>
<p>You might be wondering: why does the app wait 4 seconds for the non-main thread to complete its task? In other words, why is the process not terminated after the main thread has finished its execution?</p>
<p>Well, it is because an explicitly created thread (using the <code>Thread</code> class constructor) is a non-background (foreground) thread by default, and in .NET, the process keeps running until at least one non-background thread is still executing.</p>
<p>We can verify if the thread is a background thread by using its <code>IsBackground</code> property.</p>
<div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#403f53;--prism-background-color:#FBFBFB"><div class="codeBlockTitle_OeMC">Program.cs</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar" style="color:#403f53;background-color:#FBFBFB"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#403f53"><span class="token class-name keyword" style="color:rgb(12, 150, 155)">var</span><span class="token plain"> thread1 </span><span class="token operator" style="color:rgb(12, 150, 155)">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(12, 150, 155)">new</span><span class="token plain"> </span><span class="token constructor-invocation class-name" style="color:rgb(17, 17, 17)">Thread</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token plain"> </span><span class="token operator" style="color:rgb(12, 150, 155)">=&gt;</span><span class="token plain"> Console</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token function" style="color:rgb(153, 76, 195);font-style:italic">WriteLine</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token string" style="color:rgb(72, 118, 214)">"thread1"</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token punctuation" style="color:rgb(153, 76, 195)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">Console</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token function" style="color:rgb(153, 76, 195);font-style:italic">WriteLine</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token interpolation-string string" style="color:rgb(72, 118, 214)">$"thread1 is a background thread: </span><span class="token interpolation-string interpolation punctuation" style="color:rgb(153, 76, 195)">{</span><span class="token interpolation-string interpolation expression language-csharp">thread1</span><span class="token interpolation-string interpolation expression language-csharp punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token interpolation-string interpolation expression language-csharp">IsBackground</span><span class="token interpolation-string interpolation punctuation" style="color:rgb(153, 76, 195)">}</span><span class="token interpolation-string string" style="color:rgb(72, 118, 214)">"</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token punctuation" style="color:rgb(153, 76, 195)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">thread1</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token function" style="color:rgb(153, 76, 195);font-style:italic">Start</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token punctuation" style="color:rgb(153, 76, 195)">;</span><br></div></code></pre></div></div>
<div class="language-terminal codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#403f53;--prism-background-color:#FBFBFB"><div class="codeBlockTitle_OeMC">Output</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-terminal codeBlock_bY9V thin-scrollbar" style="color:#403f53;background-color:#FBFBFB"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#403f53"><span class="token plain">thread1 is a background thread: False</span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">thread1</span><br></div><div class="token-line" style="color:#403f53"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">Process finished with exit code 0.</span><br></div></code></pre></div></div>
<p>Additionally, we can set a thread to be a background thread.</p>
<div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#403f53;--prism-background-color:#FBFBFB"><div class="codeBlockTitle_OeMC">Program.cs</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar" style="color:#403f53;background-color:#FBFBFB"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#403f53"><span class="token class-name keyword" style="color:rgb(12, 150, 155)">var</span><span class="token plain"> newThread </span><span class="token operator" style="color:rgb(12, 150, 155)">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(12, 150, 155)">new</span><span class="token plain"> </span><span class="token constructor-invocation class-name" style="color:rgb(17, 17, 17)">Thread</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token plain"> </span><span class="token operator" style="color:rgb(12, 150, 155)">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">    </span><span class="token comment" style="color:rgb(152, 159, 177);font-style:italic">// imitate some long-running task, for example a complex pdf generation.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">    Thread</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token function" style="color:rgb(153, 76, 195);font-style:italic">Sleep</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token number" style="color:rgb(170, 9, 130)">4000</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token punctuation" style="color:rgb(153, 76, 195)">;</span><span class="token plain">    </span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">    </span><span class="token function" style="color:rgb(153, 76, 195);font-style:italic">PrintMessage</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token string" style="color:rgb(72, 118, 214)">"Generated PDF"</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token punctuation" style="color:rgb(153, 76, 195)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain"></span><span class="token punctuation" style="color:rgb(153, 76, 195)">}</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token punctuation" style="color:rgb(153, 76, 195)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line theme-code-block-highlighted-line" style="color:#403f53"><span class="token plain">newThread</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token plain">IsBackground </span><span class="token operator" style="color:rgb(12, 150, 155)">=</span><span class="token plain"> </span><span class="token boolean" style="color:rgb(188, 84, 84)">true</span><span class="token punctuation" style="color:rgb(153, 76, 195)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain"></span><span class="token function" style="color:rgb(153, 76, 195);font-style:italic">PrintMessage</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token string" style="color:rgb(72, 118, 214)">"Before calling a method 'Start'"</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token punctuation" style="color:rgb(153, 76, 195)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">newThread</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token function" style="color:rgb(153, 76, 195);font-style:italic">Start</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token punctuation" style="color:rgb(153, 76, 195)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain"></span><span class="token function" style="color:rgb(153, 76, 195);font-style:italic">PrintMessage</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token interpolation-string string" style="color:rgb(72, 118, 214)">$"After calling a method 'Start'"</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token punctuation" style="color:rgb(153, 76, 195)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain"></span><span class="token return-type class-name keyword" style="color:rgb(12, 150, 155)">void</span><span class="token plain"> </span><span class="token function" style="color:rgb(153, 76, 195);font-style:italic">PrintMessage</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token class-name keyword" style="color:rgb(12, 150, 155)">string</span><span class="token plain"> message</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token plain"> </span><span class="token operator" style="color:rgb(12, 150, 155)">=&gt;</span><span class="token plain"> </span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">    Console</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token function" style="color:rgb(153, 76, 195);font-style:italic">WriteLine</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token interpolation-string string" style="color:rgb(72, 118, 214)">$"ThreadId is </span><span class="token interpolation-string interpolation punctuation" style="color:rgb(153, 76, 195)">{</span><span class="token interpolation-string interpolation expression language-csharp">Thread</span><span class="token interpolation-string interpolation expression language-csharp punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token interpolation-string interpolation expression language-csharp">CurrentThread</span><span class="token interpolation-string interpolation expression language-csharp punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token interpolation-string interpolation expression language-csharp">ManagedThreadId</span><span class="token interpolation-string interpolation punctuation" style="color:rgb(153, 76, 195)">}</span><span class="token interpolation-string string" style="color:rgb(72, 118, 214)">. </span><span class="token interpolation-string interpolation punctuation" style="color:rgb(153, 76, 195)">{</span><span class="token interpolation-string interpolation expression language-csharp">message</span><span class="token interpolation-string interpolation punctuation" style="color:rgb(153, 76, 195)">}</span><span class="token interpolation-string string" style="color:rgb(72, 118, 214)">"</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token punctuation" style="color:rgb(153, 76, 195)">;</span><br></div></code></pre></div></div>
<div class="language-terminal codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#403f53;--prism-background-color:#FBFBFB"><div class="codeBlockTitle_OeMC">Output</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-terminal codeBlock_bY9V thin-scrollbar" style="color:#403f53;background-color:#FBFBFB"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#403f53"><span class="token plain">ThreadId is 1. Before calling a method 'Start'</span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">ThreadId is 1. After calling a method 'Start'</span><br></div><div class="token-line" style="color:#403f53"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#403f53"><span class="token plain">Process finished with exit code 0.</span><br></div></code></pre></div></div>
<p>As we can see, this time the non-main thread was set to be a background thread. Because the main thread (which is the only foreground thread now) finished before a background thread could finish, the process terminated, and since threads live inside a process, the long-running thread terminated as well.</p>
<div class="theme-admonition theme-admonition-warning admonition_xJq3 alert alert--warning"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>warning</div><div class="admonitionContent_BuS1"><p>The process exits when there are no foreground (non-background) threads left.</p></div></div>
<p>There are several other useful properties we can set on a thread, such as:</p>
<ul>
<li class="">
<p><code>Name</code> — used mostly for debugging purposes.</p>
</li>
<li class="">
<p><code>Priority</code> — if threads have the same priority, you can never guarantee thread execution order. It is the OS and the thread scheduler that decide the order. However, you can influence it by choosing from five possible priority options.</p>
<ul>
<li class=""><code>Lowest</code></li>
<li class=""><code>BelowNormal</code></li>
<li class=""><code>Normal</code></li>
<li class=""><code>AboveNormal</code></li>
<li class=""><code>Highest</code></li>
</ul>
<p>The thread scheduler will prioritize higher-priority threads and try to send them to the CPU for execution before lower-priority ones.</p>
</li>
<li class="">
<p><code>CurrentCulture</code> — controls culture-sensitive, non-UI operations for the thread, such as number, date, and currency formatting, and string comparison/sorting rules. For example, formatting a <code>DateTime</code> on a thread with <code>CurrentCulture</code> set to <code>en-US</code> produces <code>8/26/2026</code>, while <code>en-GB</code> produces <code>26/08/2026</code>.</p>
</li>
<li class="">
<p><code>CurrentUICulture</code> — determines which language-specific resources (for example, <code>.resx</code> resource files) are loaded via <code>ResourceManager</code> for that thread — in other words, what language your UI text is displayed in. It is independent of <code>CurrentCulture</code>: you could display a UI in French (<code>CurrentUICulture</code>) while still formatting dates and numbers using UK conventions (<code>CurrentCulture</code>).</p>
</li>
</ul>
<p>Other properties of the <code>Thread</code> class do not define setters, these properties are: <code>ThreadState</code>, <code>IsThreadPoolThread</code>, <code>ManagedThreadId</code> which we have already seen, <code>ExecutionContext</code>, and <code>IsAlive</code>.</p>
<p>In upcoming posts, I will explain <code>ExecutionContext</code> and <code>IsThreadPoolThread</code>, as these concepts are substantial enough to deserve their own post.</p>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_BuS1"><p>For more information on the <code>Thread</code> class, you can refer to the official <a href="https://learn.microsoft.com/en-us/dotnet/api/system.threading.thread" target="_blank" rel="noopener noreferrer" class="">Microsoft documentation</a>.</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="summary">Summary<a href="https://your-docusaurus-site.example.com/blog/getting-started-with-multithreading-code#summary" class="hash-link" aria-label="Direct link to Summary" title="Direct link to Summary" translate="no">​</a></h2>
<p>To summarize, operating systems have a thread scheduler that decides which threads get executed on a CPU core and when. Threads only live inside a process (for example, a Google Chrome process), and once a process is terminated, all of its threads are terminated as well.</p>
<p>Creating and managing threads directly with the <code>Thread</code> class, as we did in this article, works, but it is a fairly low-level and manual approach: you are responsible for starting threads, deciding whether they are background or foreground, and coordinating them safely.</p>
<p>For that reason, .NET also provides a higher-level abstraction called <code>Task</code> (in the <code>System.Threading.Tasks</code> namespace), which is commonly used together with <code>async</code>/<code>await</code> to run work without blocking the calling thread. Under the hood, tasks are usually executed on the <code>ThreadPool</code> rather than on dedicated threads you manage yourself. I will cover <code>Task</code> and asynchronous programming in one of the upcoming posts.</p>]]></content:encoded>
            <category>Dotnet</category>
            <category>Async Code</category>
        </item>
    </channel>
</rss>