Show HN: HLinq: easy to use and extensible .NET resource query language
github.comHi! For last two years I am working on side project: dynamically configurable, zero-downtime API, with low-code flows to write small pieces of logic - Hamster Wheel. For this I had to build my own resource query language in order for the user to be able to query specific data from the API via GET endpoints.
HLinq is a library that adds query language capabilities to any API written in modern .net.
Demo in memory collection: https://hlinq-demo.podbielski.it/demo/memory
Demo, db collection: https://hlinq-demo.podbielski.it/demo/db
GitHub: https://github.com/npodbielski/HamsterWheel.HLinq?tab=readme...
Some information about Hamster Wheel: https://internetexception.com/why-hamster-wheel/
HLinq Design: https://internetexception.com/2025/10/28/hlinq-design/
Fluent Code Generators: https://github.com/npodbielski/HamsterWheel.FluentCodeGenera...
I started working on dynamic API as a way to have one platform for my self-host lab tinkering. I.e. to have ability check for health of my self-hosted services and restart them if necessary. Or to open/close my house driveway gate or for automated watering in my garden. Writing an API for each of those is a bit tiresome so having one single API that I can configure instead seems like better idea. For this API project consists of 4 parts: code generaterators, query language, flows runner and of course host API.
HLinq demo pages allows to edit the query inside the browser window! I.e.:
Some selecting examples:
https://hlinq-demo.podbielski.it/demo/db?select[x.firstName] - return only one property
https://hlinq-demo.podbielski.it/demo/db?select[x.firstName,... - return only two properties
https://hlinq-demo.podbielski.it/demo/db?select[fullName=x.f... - the same two properties but name will be renamed to "fullName"
https://hlinq-demo.podbielski.it/demo/db?select[fullName=x.f... - you can add syntactic property to the response
Some filtering examples:
https://hlinq-demo.podbielski.it/demo/db?where[x.id>22].select[fullName=x.firstName] - get names of people that have ids bigger than 22
https://hlinq-demo.podbielski.it/demo/db?where[ilike(x.first... - case-insensitive search for 'b*' string
https://hlinq-demo.podbielski.it/demo/db?where[x.id==22] - exact value search
https://hlinq-demo.podbielski.it/demo/db?where[(x.id==22||x.... - conditions grouping and logical operators
Ordering:
https://hlinq-demo.podbielski.it/demo/db?orderBy[x.firstName...
Paging:
https://hlinq-demo.podbielski.it/demo/db?skip[200] - skip first 200 records
https://hlinq-demo.podbielski.it/demo/db?take[500] - take at most 500 records
https://hlinq-demo.podbielski.it/demo/db?skip[100].take[10] - skip first 100 records than take 10 records
https://hlinq-demo.podbielski.it/demo/db?count[] - count number of records in entire collection
https://hlinq-demo.podbielski.it/demo/db?where[x.firstName.c...[] - count number of persons with first name containing 'b'