Show HN: HLinq: easy to use and extensible .NET resource query language

github.com

3 points by npodbielski 4 hours ago

Hi! 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'