Live from Orchard Harvest 2025 Prague - Day 2

Today we had the second day of the Orchard Harvest 2025 conference. In this post, we would like to summarize what happened on the second day of the conference.

Translating LINQ to SQL: caching, nullability and other deep topics from EF's query pipeline

The first presenter of the day was Shay Rojansky. He talked about the EF internal query architecture, caching, and performance, and showed us some tricky cases of LINQ to SQL translation. He highlighted why EF's job is harder than ORMs in other languages. He mentioned that C# captured variables (closures) are your way of asking for SQL parameterization. He showed us how to translate equality, which can be challenging given SQL's 3-valued logic. In SQL, NULL can generally be understood as "unknown". Therefore, NULL = NULL isn't true (like 3 = 3), it's NULL. NULL evaluates to false in WHERE.

Finally, he showed us the parameterized collections. Before EF 8.0, they inlined the parameterized collections as inlined constants, but the problem was that the different array parameters caused different SQLs and different plans. Starting with EF 8.0, they send the parameterized collections as a JSON array, which is a single SQL, which is great, but the query planner can't see cardinality, yielding bad plans. And starting with EF 10, they translate the collection as parameters, and they even pad/bucketize to reduce the SQL variations.

Redefining User Experience: Building Flexible, Creator-led Websites with Orchard Core

Nick Jackson started his presentation by discussing the challenges they faced with the Flow Part. He mentioned the complex structure, unpredictable layouts, and the overwhelming flexibility. They defined a custom Block stereotype that could be used like the existing Widget stereotype in Orchard Core. Content types with the Block stereotype can support multiple configurations, allowing users to customize the look and feel of a building block easily. They can easily set the block's background color, specify the image's style within the block, and so on. They defined a new editor type for content types with a Bag Part attached that lets you override the layout, allowing you to select the content type you want to add to the layout in a more user-friendly way.

With several other interesting building blocks, he also demoed the new Media Field editor, which enhances the user experience with smoother, more intuitive functionality. You can read about this one in detail, with a recording, in this post.

Orchard Forms for Everyone: Reducing Complexity Through Intuitive Design

Alcwyn Parker from Buzz Interactive mentioned the UX challenges faced by non-technical users when creating forms. He presented the UX goals and Design Principles, and demoed the Prize Draw Form, along with an overview of the implementation of inputs and actions. Building and deploying forms in Orcahrd Core can be difficult for non-technical users. The current form-building experience consists of two parts: form building and data processing. Building the forms involves setting up the name and the ID of the elements properly, and data processing could cause having a complex workflow with more than 10 workflow notes, where you need to know how to bind state and do the validation.

The solution was to hoist the form settings, use a generic workflow, and create three new form processing workflow tasks. Using a new custom Form content type, you can easily set up the form's content, add elements, and specify the confirmation type (show a message, redirect to a URL, or redirect to a content item). The Prize Draw Form checks the entered data after submission and, if it matches a given value, displays different kinds of messages sent via email.

Bridging Systems: Seamless Data Integration in Orchard Core

Patrik Navrátil from PuxDesign mentioned that they have several clients with existing solutions, and the project is to migrate content from other CMSs to Orchard Core. It also means integration with the client's ERP system or periodical imports via API or XLSX files. So they needed a way that was easy to work with, using editable definitions and solutions that were easily extendable.

He showed a demo on how to import content from WordPress to Orchard Core. WordPress exports the content using XML files. And by using their custom data import modules, Orchard Core can import the data from these XML files. They are using Liquid to transform the data when setting up the item recipe definition for each import profile. Having a recipe definition makes it easier for Orchard Core to create content items based on the data defined in the recipes.

Panel Discussion

We continued our program with the panel discussion. Shay Rojansky, Nick Jackson, Chris Durkin, and Bertrand Le Roy were there to answer your questions submitted in the past weeks. We had a great time and got great questions, like

  • When should we start dropping support for older .NET versions? (GitHub Discussion)
  • What is the future of ASP.NET Core and Orchard Core?
  • Can we replace YesSql in Orchard Core?
  • How much do you enjoy using Orchard Core?

The panel discussion was moderated by Sebastien Ros.

Live from Orchard Harvest 2025 Day 2

Maintaining dependencies of Orchard Core apps with Renovate

In his second talk, Zoltán Lehóczky from Lombiq Technologies discussed how to keep the dependencies of your applications up to date. He mentioned that you can automatically update NuGet and NPM packages with Renovate. Renovate is endlessly configurable, free, and open-source, and Orchard Core also uses it. After, he demoed how to add Renovate to your application and showed the Renovate GitHub dashboard. First, you have to configure Renovate by adding a renovate.json5 file to the root of your repository. By using that file, you can configure the pull requests that Renovate opens, set which packages you don't want to be updated by Renovate, how often you want Renovate to open pull requests, and so on.

He also showed how to run Renovate using GitHub Actions. It can be triggered manually, and of course, you can also use a cron expression to schedule it. Finally, he pointed out the differences between the Mend Renovate App (cloud-hosted) and GitHub Actions (self-hosted). The good news is Renovate will take care of keeping updates in mind, but you have to adapt your code to dependency changes.

From CMS to cross-platform: Orchard Core meets MAUI Blazor Hybrid

The last talk is from Márk Bartha from Lombiq Technologies who talked about in the past, he already tried to use Blazor with Orchard Core. Blazor is a framework for interactive web UI; C# instead of JavaScript. And MAUI is a native shell, the same .NET project on Windows, Android, and iOS. Using a single solution, it’s possible to combine an Orchard Core backend with a Blazor Hybrid (MAUI) app and a Blazor WebAssembly app, all sharing common components for a smoother development experience. And he demoed this solution today!

He showed the solution architecture, which consists of a headless Orchard Core app with OpenID configuration. The app contains a ToDos module, a theme with login shape overrides. The shared components contain domain objects, common styles, and common assets. Here you can find the repository for the cross-platform to-do application with a nicely detailed README file.


Thank you for attending this year's Harvest Conference, and we hope you enjoyed the event as much as we did! If you could share your experience on social platforms, that would help us organize the next events. You can use the #OrchardHarvest hashtag to mention our event.