<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Konstantin Triger</title>
    <description>The latest articles on Forem by Konstantin Triger (@kostat).</description>
    <link>https://forem.com/kostat</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F272976%2F2d7f15a2-aa37-415b-ad31-3a0bcb82d7c2.jpeg</url>
      <title>Forem: Konstantin Triger</title>
      <link>https://forem.com/kostat</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/kostat"/>
    <language>en</language>
    <item>
      <title>Hierarchical Queries in SQL with C# and Entity Framework Core</title>
      <dc:creator>Konstantin Triger</dc:creator>
      <pubDate>Wed, 29 Apr 2020 16:30:49 +0000</pubDate>
      <link>https://forem.com/kostat/hierarchical-query-in-sql-with-c-and-entity-framework-core-1ojd</link>
      <guid>https://forem.com/kostat/hierarchical-query-in-sql-with-c-and-entity-framework-core-1ojd</guid>
      <description>&lt;p&gt;Hierarchies are very common in our lives and therefore in the problems we need to solve. The most familiar cases are organizations, products built from parts and other products, file systems etc.&lt;/p&gt;

&lt;p&gt;When an hierarchy is stored in a database table, it's usually represented by rows referencing parent rows, recursively.&lt;/p&gt;

&lt;p&gt;Suppose we want to query all the employees (directly or indirectly) reporting to a mid-level manager. Can we do that in SQL?&lt;/p&gt;

&lt;p&gt;Of course there is a naive solution to select employees directly reporting to that manager, take their ids, perform the query again, etc. But clearly it's not efficient. Fortunately SQL has a standard support for &lt;a href="https://www.sqlservertutorial.net/sql-server-basics/sql-server-recursive-cte/"&gt;hierarchical queries&lt;/a&gt; in a single and efficient query.&lt;/p&gt;

&lt;p&gt;The following example demonstrates an hierarchical query using C# and EF Core using &lt;a href="https://entitylinq.com"&gt;ELINQ&lt;/a&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="n"&gt;managerId&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;//external parameter - "highest" manager id&lt;/span&gt;

&lt;span class="n"&gt;DbContext&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Staffs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Query&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;org&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;SubQuery&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;Staffs&lt;/span&gt; &lt;span class="n"&gt;managers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Staffs&lt;/span&gt; &lt;span class="n"&gt;employees&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;SELECT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;managers&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nf"&gt;FROM&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;managers&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nf"&gt;WHERE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;managers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ManagerId&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="n"&gt;managerId&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="nf"&gt;UNION_ALL&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

        &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;manager&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Current&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

        &lt;span class="nf"&gt;SELECT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;employees&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nf"&gt;FROM&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;employees&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;JOIN&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;manager&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;ON&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;employees&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Manager&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="n"&gt;manager&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;

    &lt;span class="nf"&gt;WITH&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;org&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="c1"&gt;// At this point org "table" contains the employees we need.&lt;/span&gt;
    &lt;span class="c1"&gt;// We can SELECT, JOIN, or filter it as any other table.&lt;/span&gt;

    &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;SELECT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;org&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nf"&gt;FROM&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;org&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;You can run this example "live" &lt;a href="https://try.entitylinq.com/docs/SqlServerTutorial/RecursiveCTE.md"&gt;here&lt;/a&gt; or &lt;a href="https://try.entitylinq.com/"&gt;learn more&lt;/a&gt; about EF Core and SQL integration.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--4e8IdbL8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/7jdqg295hds2ff8akb9v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--4e8IdbL8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/7jdqg295hds2ff8akb9v.png" alt="Where are you?"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>sql</category>
      <category>csharp</category>
      <category>efcore</category>
      <category>dotnet</category>
    </item>
    <item>
      <title>New LINQ for EF Core</title>
      <dc:creator>Konstantin Triger</dc:creator>
      <pubDate>Tue, 24 Mar 2020 22:59:02 +0000</pubDate>
      <link>https://forem.com/kostat/new-linq-for-ef-core-43a0</link>
      <guid>https://forem.com/kostat/new-linq-for-ef-core-43a0</guid>
      <description>&lt;p&gt;There is is an interactive &lt;a href="http://xlinq.live/"&gt;demo site&lt;/a&gt; powered by Try .NET.&lt;/p&gt;

</description>
      <category>dotnet</category>
      <category>csharp</category>
      <category>sql</category>
      <category>linq</category>
    </item>
    <item>
      <title>Fluent MongoDB queries from Java</title>
      <dc:creator>Konstantin Triger</dc:creator>
      <pubDate>Sat, 16 Nov 2019 12:33:12 +0000</pubDate>
      <link>https://forem.com/kostat/fluent-mongodb-queries-from-java-4okm</link>
      <guid>https://forem.com/kostat/fluent-mongodb-queries-from-java-4okm</guid>
      <description>&lt;p&gt;MongoDB is doing great, firmly holding a prestigious #5 on the db-engines ranking site. It means that we, developers, are using it a lot.&lt;/p&gt;

&lt;p&gt;When looking on the official &lt;a href="https://mongodb.github.io/mongo-java-driver/3.11/driver/tutorials/perform-read-operations/#filters-helper"&gt;driver API&lt;/a&gt;, we can see an effort to make an API as fluent as possible:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="n"&gt;collection&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;find&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;and&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gte&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"stars"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt; &lt;span class="n"&gt;lt&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"stars"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt; &lt;span class="n"&gt;eq&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"categories"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Bakery"&lt;/span&gt;&lt;span class="o"&gt;)));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Yet, there are many issues:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;All fields are Strings without auto completion.&lt;/li&gt;
&lt;li&gt;No type safety on operators (Is &lt;code&gt;stars&lt;/code&gt; a number?! Is &lt;code&gt;categories&lt;/code&gt; a collection (?!) of Strings or …?!).&lt;/li&gt;
&lt;li&gt;Do we really like using &lt;code&gt;gte&lt;/code&gt; for &lt;code&gt;&amp;gt;=&lt;/code&gt; ?! I mean, is it easy to read and understand this expression?&lt;/li&gt;
&lt;li&gt;And finally, when the schema changes, we are back to 80' with find-replace…&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There is a simple and effective solution to those issues — &lt;a href="https://github.com/streamx-co/FluentMongo"&gt;FluentMongo&lt;/a&gt;, which adds the missing ingredient to the API — type safety and Java integration. It lets you use &lt;strong&gt;normal Java&lt;/strong&gt; to write filters, projections, updates, sorts and indexes. For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="n"&gt;collection&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;find&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;filter&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getStars&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getStars&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;
                                    &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getCategories&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;contains&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Bakery"&lt;/span&gt;&lt;span class="o"&gt;)));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;You can be both &lt;strong&gt;&lt;a href="https://github.com/streamx-co/FluentMongo"&gt;productive&lt;/a&gt;&lt;/strong&gt; with MongoDB and write a &lt;strong&gt;maintainable&lt;/strong&gt; code now!&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>mongodb</category>
      <category>java</category>
    </item>
  </channel>
</rss>
