{"id":20730157,"url":"https://github.com/candoumbe/queries","last_synced_at":"2025-04-23T21:22:40.965Z","repository":{"id":37677647,"uuid":"336344290","full_name":"candoumbe/Queries","owner":"candoumbe","description":"A set of helper classes to build queries in a secure way","archived":false,"fork":false,"pushed_at":"2025-04-09T19:13:16.000Z","size":3286,"stargazers_count":5,"open_issues_count":9,"forks_count":1,"subscribers_count":0,"default_branch":"develop","last_synced_at":"2025-04-09T20:23:45.397Z","etag":null,"topics":["efcore","entity-framework-core","migrations","mysql","neo4j","postgres","queries","query-builder","sql","sql-server","sqlite"],"latest_commit_sha":null,"homepage":"","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/candoumbe.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2021-02-05T17:38:15.000Z","updated_at":"2025-04-09T19:13:19.000Z","dependencies_parsed_at":"2023-12-27T02:25:22.758Z","dependency_job_id":"34aa5293-be46-4715-9f3b-92402b255a67","html_url":"https://github.com/candoumbe/Queries","commit_stats":null,"previous_names":[],"tags_count":6,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/candoumbe%2FQueries","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/candoumbe%2FQueries/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/candoumbe%2FQueries/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/candoumbe%2FQueries/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/candoumbe","download_url":"https://codeload.github.com/candoumbe/Queries/tar.gz/refs/heads/develop","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":250515332,"owners_count":21443372,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["efcore","entity-framework-core","migrations","mysql","neo4j","postgres","queries","query-builder","sql","sql-server","sqlite"],"created_at":"2024-11-17T05:10:01.000Z","updated_at":"2025-04-23T21:22:40.947Z","avatar_url":"https://github.com/candoumbe.png","language":"C#","readme":"# Queries \u003c!-- omit in toc --\u003e\n\n![GitHub Main branch Status](https://img.shields.io/github/actions/workflow/status/candoumbe/queries/delivery.yml?branch=main\u0026label=main)\n![GitHub Develop branch Status](https://img.shields.io/github/actions/workflow/status/candoumbe/queries/integration.yml?branch=develop\u0026label=develop)\n[![codecov](https://codecov.io/gh/candoumbe/DataFilters/branch/develop/graph/badge.svg?token=FHSC41A4X3)](https://codecov.io/gh/candoumbe/DataFilters)\n[![GitHub raw issues](https://img.shields.io/github/issues-raw/candoumbe/queries)](https://github.com/candoumbe/queries/issues)\n[![DataFilters ](https://img.shields.io/nuget/vpre/queries.core?label=Queries.Core)](https://nuget.org/packages/queries.core)\nThis is a \"basic\" datastore agnostic query builder.\n\n**Table of contents**\n- [\u003ca href=\"#\" id=\"lnk-why\"\u003eWhy?\u003c/a\u003e](#why)\n- [\u003ca href=\"#\" id=\"lnk-coupling\"\u003eNo more tightly coupled SQL string\u003c/a\u003e](#no-more-tightly-coupled-sql-string)\n- [\u003ca href=\"#\" id=\"lnk-secured\"\u003eSQL queries secured by default\u003c/a\u003e](#sql-queries-secured-by-default)\n- [Building statements](#building-statements)\n  - [\u003ca href=\"#\" id='section-columns'\u003eColumns\u003c/a\u003e](#columns)\n    - [\u003ca href=\"#\"\u003eStatements\u003c/a\u003e](#statements)\n      - [\u003ca href=\"#\" id='select-query'\u003eSelect\u003c/a\u003e](#select)\n      - [\u003ca href=\"#\" id='update-query'\u003eUpdate\u003c/a\u003e](#update)\n      - [\u003ca href=\"#\" id=\"delete-query\"\u003eDelete\u003c/a\u003e](#delete)\n      - [\u003ca href=\"#\" id=\"insert-query\"\u003eInsert\u003c/a\u003e](#insert)\n      - [Combine](#combine)\n    - [\u003ca href=\"#\" id='#criterias'\u003eCriterias\u003c/a\u003e](#criterias)\n      - [\u003ca href=\"#\" id='where'\u003eWhere\u003c/a\u003e](#where)\n      - [\u003ca href=\"#\" id='where'\u003eHaving\u003c/a\u003e](#having)\n    - [\u003ca href='#'\u003eFunctions\u003c/a\u003e](#functions)\n  - [\u003ca href=\"#\" id='rendering-statements'\u003eRendering statements\u003c/a\u003e](#rendering-statements)\n    - [\u003ca href=\"#\" id='renderer-sql-server'\u003e SQL Server Query Renderer\u003c/a\u003e](#-sql-server-query-renderer)\n    - [\u003ca href=\"#\" id='renderer-mysql'\u003eMySQL Query Renderer\u003c/a\u003e](#mysql-query-renderer)\n    - [\u003ca href=\"#\" id='renderer-mysql'\u003eSqlite Query Renderer\u003c/a\u003e](#sqlite-query-renderer)\n    - [QueryRendererSettings](#queryrenderersettings)\n  - [How to install ?](#how-to-install-)\n- [Contribute](#contribute)\n- [What's new](#whats-new)\n\n# \u003ca href=\"#\" id=\"lnk-why\"\u003eWhy?\u003c/a\u003e\n\nThe idea of this project came to me when I dealt with Entity Framework 6.x Code First for a project I was working on as Architect.\n\nWe used Migrations to make changes to our database and sometimes we needed to write plain SQL statements as part of migratinuons.\nFor this, the EF 6.x \u003ccode\u003eSql(...)\u003c/code\u003e command allows to add additional SQL statements that will be executed alongside the migrations. \nBut I wasn't happy with that approach as the written SQL was tightly coupled to the database engine those migrations were run against. \nI wanted something more dynamic allowing to code SQL once in the migrations and be sure that it will run smoothly if we switch from SQL Server to PostgreSQL / MySQL / ... .\n\n# \u003ca href=\"#\" id=\"lnk-coupling\"\u003eNo more tightly coupled SQL string\u003c/a\u003e\nWriting tightly coupled SQL means that you're writing SQL statements that are specific to a database engine. \u003cbr /\u003e\n\nThe following SQL string\n```SQL\nSELECT [Firstname] + ' ' + [Lastname] AS [fullname] FROM [members]\n```\nis tightly coupled to SQL Server engine and won't work if dealing with Postgres whereas\n```csharp\n    // import the library\n    import static Queries.Core.Builders.Fluent.QueryBuilder // C# 7 syntax\n    import _ = Queries.Core.Builders.Fluent.QueryBuilder    // Pre C# 6 syntax\n\n    //compute a \"static\" query\n    IQuery query = Select(Concat(\"firstname\").Field(), \" \".Literal(), \"lastname\".Field()).From(\"members\");\n```\n will output\n \n```csharp\n    //For SQL SERVER\n    string sqlServerString = query.ForSqlServer();\n    Console.Writeline(sqlServerString); // SELECT [Firstname] + ' ' + [Lastname] AS [fullname] FROM [members]\n\n    //For Postgres\n    string postgresSqlString = query.ForPostgres(); \n    Console.Writeline(postgresSqlString);// SELECT \"Firstname\" + ' ' + \"Lastname\" \"fullname\" FROM \"members\"\n```\n# \u003ca href=\"#\" id=\"lnk-secured\"\u003eSQL queries secured by default\u003c/a\u003e\n\nMost developers know about [SQL injection](https://en.wikipedia.org/wiki/SQL_injection) and how to protect from it.\nBut when using SQL string throughout one's codebase, it can quickly become a tedious task to secure each and every SQL query.\u003cbr /\u003e\nSure there's the ADO.NET library which provide various classes to create parameterized queries but this add more and more boilerplate code :\n\n```csharp\nusing (var conn = GetConnectionSomehow() )\n{\n    conn.Open();\n\n    DbParameter nicknameParam = new SqlParameter();\n    nicknameParam.SqlDbType = SqlDbType.String;\n    nicknameParam.ParameterName = \"@nickname\";\n    nicknameParam.Value = \"Bat%\";\n\n    SqlCommand cmd = new SqlCommand()\n    cmd.Connection = conn;\n    \n    cmd.CommandText = \"SELECT Firstname + ' ' + 'Lastname' FROM SuperHero WHERE Nickname LIKE @nickname\";\n\n    var result = cmd.ExecuteQuery();\n\n    ....\n\n    conn.Close();\n}\n```\n\nwhereas with `Queries` :\n\n```csharp\nusing (var conn = GetConnectionSomehow() )\n{\n    conn.Open();\n\n    IQuery query = Select(Concat(\"Firstname\".Field(), \" \".Literal(), \"Lastname\".Field())\n        .From(\"SuperHero\")\n        .Where(\"Nickname\", Like, \"Bat%\" );\n\n    cmd.CommandText = query.ForSqlServer();\n    \n    /* CommandText now contains\n\n     DECLARE @p0 NVARCHAR(max);\n     SET @p0 = 'Bat%';\n     SELECT Firstname + ' ' + 'Lastname' FROM SuperHero WHERE Nickname LIKE @p0;\n\n    */\n\n    var result = cmd.ExecuteQuery();\n\n    ....\n\n    conn.Close();\n}\n```\n\nThe code is shorter, clearer as the boilerplate code is no longer a distraction\n\n# Building statements\n\n## \u003ca href=\"#\" id='section-columns'\u003eColumns\u003c/a\u003e\n\n[IColumn][class-columns-icolumn] is the base interface that all column like types implement.\n\n- \u003ca href=\"#\" id='columns-field'\u003e [FieldColumn][class-columns-field]\u003c/a\u003e contains a column name.\n\n- \u003ca href=\"#\" id='columns-literal'\u003eLiteralColumn\u003c/a\u003e\nUses the following classes whenever you want to write a \"raw\" data in a query\n\n- \u003ca href=\"#\" id='columns-boolean'\u003e[BooleanColumn][class-columns-boolean]\u003c/a\u003e : a column that can contains a boolean value.\u003cbr /\u003e\n \nUse this class to output a boolean value in the query\n\n```csharp\nIQuery query = Select(\"Firstname\".Field(), \"Lastname\".Field())\n    .From(\"members\")\n    .Where(\"IsActive\", EqualTo, new BooleanColumn(true));\n```\n\ncan also be written \n\n```csharp\nIQuery query = Select(\"Firstname\".Field(), \"Lastname\".Field())\n                .From(\"members\")\n                .Where(\"IsActive\", EqualTo, true);\n```\nwhich will output for\n```SQL\nSELECT [Firstname], [Lastname] FROM [members] WHERE [IsActive] = 1\n```\n- [DateTimeColumn][class-columns-datetime] : a [IColumn][class-columns-icolumn] implementation that can contains a `date`/`time`/`datetime` value.\u003cbr /\u003e\nUse this class to output a `DateTime`/`DateTimeOffset` value.\n\n- [StringColumn][class-columns-string] : an [IColumn][class-columns-icolumn] implementation that contains \"string\" values\n\n```csharp\nIQuery query = Select(\"Firstname\".Field(), \"Lastname\".Field())\n    .From(\"members\")\n    .Where(\"DateOfBirth\", EqualTo, 1.April(1990));\n```\n\nYou can optionally specify a format to use when rendering the variable with the `Format(string format)` extension method.\n```csharp\nIQuery query = Select(\"Firstname\".Field(), \"Lastname\".Field())\n    .From(\"members\")\n    .Where(\"DateOfBirth\", EqualTo, 1.April(1990).Format(\"dd-MM-yyyy\"));\n```\n\n💡 Use the column type most suitable to your need to leverage both intellisence and the fluent builder API.\n\n### \u003ca href=\"#\"\u003eStatements\u003c/a\u003e\n\nYou can start building various statements after [installing](#how-to-install-) the Queries.Core package.\n\n#### \u003ca href=\"#\" id='select-query'\u003e[Select][class-select-query]\u003c/a\u003e\n\nCreate a [`SelectQuery`][class-select-query] instance either by using the builder or the fluent syntax to build (drum rolling ...) a [SELECT query](https://www.w3schools.com/sql/sql_select.asp)\n\n```csharp\n// Using builders ...\nIQuery query = new SelectQuery \n{\n    Columns = new IColumn[]\n    {\n        new FieldColumn(\"Firstname\"),\n        new FieldColumn(\"Lastname\")\n    },\n    Tables = new ITable[] \n    {\n        new Table(\"members\")\n    }\n};\n\n// ... or fluent syntax\nIQuery query = Select(\"Firstname\".Field(), \"Lastname\".Field())\n    .From(\"members\");\n```\n#### \u003ca href=\"#\" id='update-query'\u003e[Update][class-update-query]\u003c/a\u003e\n\nCreate a [`UpdateQuery`][class-update-query] instance either by using the builder or the fluent syntax to build (drum rolling ...) an [UPDATE](https://www.w3schools.com/sql/sql_update.asp) statement\n```csharp\n// Using builders ...\nIQuery query = new UpdateQuery \n{\n    Table = new Table(\"members\"),\n    Values = new []\n    {\n        new UpdateFieldValue(\"Nickname\".Field(), \"Nightwing\")\n    },\n    WhereCriteria = new WhereClause{ Column = \"NickName\", Operator = EqualTo, Value = \"Robin\" }\n}\n\n// ... or with fluent syntax\nIQuery query = Update(\"members\")\n                .Set(\"Nickname\".Field().EqualTo(\"NightWing\"))\n                .Where(\"Nickname\", EqualTo, \"Robin\");\n```\n\n#### \u003ca href=\"#\" id=\"delete-query\"\u003e[Delete][class-delete-query]\u003c/a\u003e\n\nCreate a [`DeleteQuery`][class-delete-query] instance either by using the builder or the fluent syntax to build (drum rolling ...) an [DELETE](https://www.w3schools.com/sql/sql_delete.asp) statement\n\n```csharp\n// Using builders ...\nIQuery query = new DeleteQuery \n{\n    Table = new Table(\"members\"),\n    WhereCriteria = new WhereClause{ Column = \"Activity\", Operator = NotLike, Value = \"%Super hero%\" }\n}\n\n// ... or with fluent syntax\nIQuery query = Delete(\"members\")\n               .Where(\"Activity\".Field(), NotLike, \"%Super hero%\")\n\n```\n\n#### \u003ca href=\"#\" id=\"insert-query\"\u003e[Insert][class-insert-query]\u003c/a\u003e\n\nCreate a [`InsertIntoQuery`][class-insert-query] instance either by using the builder or the fluent syntax to build (drum rolling ...) an [INSERT INTO](https://www.w3schools.com/sql/sql_insert.asp) statement\n\n```csharp\n// Using builders ...\nIQuery query = new InsertIntoQuery\n\n// ... or with fluent syntax\nIQuery query = InsertInto(\"members\")\n                    .Values(\n                        \"Firstname\".Field().InsertValue(\"Bruce\".Literal()),\n                        \"Lastname\".Field().InsertValue(\"Wayne\".Literal())\n                    )\n\n```\n\n\nor even combine them using a [BatchQuery][class-builders-batch-query]\n\n\n#### [BatchQuery][class-batch-query] \n\n```csharp\nBatchQuery batch = new BatchQuery(\n    InsertInto(\"members\").Values(\"Firstname\".Field().EqualTo(\"Harley\"), \"Lastname\".Field().EqualTo(\"Quinzel\"))\n    Delete(\"members_bkp\").Where(\"Nickname\".Field(), EqualTo, \"\"))\n);\n```\n\n**Warning**\n\nAll `xxxxQuery` classes are all mutable (unless specified otherwise) meaning that any instance can be modified \n**AFTER** being created.\nUse the \u003ccode\u003e.Clone()\u003c/code\u003e method to duplicate any instance.\n\n\n### \u003ca href=\"#\" id='#criterias'\u003eCriterias\u003c/a\u003e \n\u003ccode\u003eQueries.Core.Parts.Clauses\u003c/code\u003e namespace contains classes to add filters to \u003ccode\u003eIQuery\u003c/code\u003e instances.\n#### \u003ca href=\"#\" id='where'\u003eWhere\u003c/a\u003e\n\n- [WhereClause][class-where-clause] : a criterion that will be applied to only one field of a [IQuery][class-iquery]\n- [CompositeWhereClause][class-complex-where-clause] : combine several [IWhereClause][class-iwhere-clause] instances together.\n\n#### \u003ca href=\"#\" id='where'\u003eHaving\u003c/a\u003e\n\n- [HavingClause][class-having-clause] : a criterion that will be applied to only one field of a [IQuery][class-iquery]\n- [CompositeHavingClause][class-complex-having-clause] : allow to combine several [IHavingClause][class-ihaving-clause] instances together.\n\n\n### \u003ca href='#'\u003eFunctions\u003c/a\u003e\n\nSeveral functions are supported out of the box. See [IFunction][class-functions] implementations and associated unit tests to see how to use them when building statemeents.\n\n\n💡 You can always use [NativeQuery](src/Queries.Core/Builders/NativeQuery.cs) whenever you need to write a statement that is not yet supported by the libray.\n\n## \u003ca href=\"#\" id='rendering-statements'\u003eRendering statements\u003c/a\u003e\nRenderers are special classes that can produce a SQL string given a [IQuery][class-iquery] instance.\n\n```csharp\nIQuery query = GetQuery();\nstring sql = query.ForXXX() // where XXX stand for a database engine to target\n```\n\n### \u003ca href=\"#\" id='renderer-sql-server'\u003e [SQL Server Query Renderer](https://www.nuget.org/packages/Queries.Renderers.SqlServer)\u003c/a\u003e\nBuilds SQL string that can be used with SQL Server Database Engine\n\n```csharp\nIQuery query = Select(Concat(\"Firstname\".Field(), \" \".Literal(), \"Lastname\".Field()).As(\"Fullname\"))\n    .From(\"members\".Table())\n    .Where(\"Age\".Field().GreaterThanOrEqualTo(18));\n\nstring sql = query.ForSqlServer(new QueryRendererSettings { PrettyPrint = true });\n\nConsole.WriteLine(sql);\n\n/*\n\nDECLARE @p0 NUMERIC = 18;\nSELECT [Firstname] + ' ' + [Lastname] FROM [members] WHERE [Age] \u003e= @p0\n\n*/ \n```\n\n### \u003ca href=\"#\" id='renderer-mysql'\u003e[MySQL Query Renderer](https://www.nuget.org/packages/Queries.Renderers.MySql)\u003c/a\u003e\nBuilds SQL string that can be used with MySQL Database Engine\n\n```csharp\nIQuery query = Select(Concat(\"Firstname\".Field(), \" \".Literal(), \"Lastname\".Field()).As(\"Fullname\"))\n    .From(\"members\".Table())\n    .Where(\"Age\".Field().GreaterThanOrEqualTo(18));\n\nstring sql = query.ForMySql(new QueryRendererSettings { PrettyPrint = true });\n\nConsole.WriteLine(sql);\n\n/*\n\nDECLARE @p0 NUMERIC = 18;\nSELECT [Firstname] + ' ' + [Lastname] FROM [members] WHERE [Age] \u003e= @p0\" \n\n*/\n```\n\n### \u003ca href=\"#\" id='renderer-mysql'\u003e[Sqlite Query Renderer](https://www.nuget.org/packages/Queries.Renderers.Sqlite)\u003c/a\u003e\nBuilds SQL string that can be used with Sqlite Database Engine\n\n```csharp\nIQuery query = Select(Concat(\"firstname\".Field(), \" \".Literal(), \"lastname\".Field()).As(\"Fullname\"))\n                    .From(\"superheroes\")\n                    .Where(\"nickname\".Field(), EqualTo, \"Batman\");\n\nstring sql = query.ForSqlite(new SqliteRendererSettings { PrettyPrint = true });\n\nConsole.WriteLine(sql); \n\n/*\n\nBEGIN; \nPRAGMA temp_store = 2; \nCREATE TEMP TABLE \"_VARIABLES\"(ParameterName TEXT PRIMARY KEY, RealValue REAL, IntegerValue INTEGER, BlobValue BLOB, TextValue TEXT); \nINSERT INTO \"_VARIABLES\" (\"ParameterName\") VALUES ('p0'); \nUPDATE \"_VARIABLES\" SET \"TextValue\" = 'Batman' WHERE (\"ParameterName\" = 'p0')\nSELECT \"firstname\" || ' ' || \"lastname\" AS \"Fullname\" \" \nFROM \"superheroes\" \" \nWHERE (\"nickname\" = (SELECT COALESCE(\"RealValue\", \"IntegerValue\", \"BlobValue\", \"TextValue\") FROM \"_VARIABLES\" WHERE (\"ParameterName\" = 'p0') LIMIT 1));\nDROP TABLE \"_VARIABLES\";\nEND\n\n*/\n```\n\n\n💡 There are several renderers already available on [nuget.org](https://www.nuget.org/packages?q=Queries.Renderers).\n\n\n### QueryRendererSettings\nThe \"shape\" of the string returned by a [renderer](#rendering-statements) (date format, parameterized query, ...) can \nbe customized by providing an implementation of [QueryRendererSettings][class-query-renderer-settings] instance.\nto the \u003ccode\u003eForXXXX()\u003c/code\u003e method.\n```csharp\nIQuery query = ...\nQueryRendererSettings settings = new MyCustomRendererSettings();\nstring sql = query.ForXXX(settings) // where XXX stand for a database engine to target\n```\n\n- `DateFormatString` : defines how DateTimes should be printed (`YYYY-MM-DD` by default)\n- `FieldnameCasingStrategy` : Defines the column name casing strategy (`Default` meaning no transformation)\n- `PrettyPrint`\n- `Parametrization` : a hint for renderers on how to handle all variables a [IQuery] my embbed. \nThis is useful when variables declaration has already been taken care of (see [CollectVariableDeclaration](#collect-variables)) \n\n\n## How to install ?\n\n1.  Run `dotnet add package Queries.Core`  command to get the latest version of the [Queries.Core](https://www.nuget.org/packages/Queries.Core/) \n    package and references it in your project.\u003cbr /\u003e\n    From this point you can start building queries in your code.\n2.  Download the Queries.Renderers.XXXXX that is specific to the database engine you're targeting.\n    This will add extensions methods `ForXXXX` to all [IQuery][class-iquery] instances that produces SQL statements\n3.  Enjoy !!!\n\n# Contribute\nCheck out the [contribution guidelines](./CONTRIBUTING.md) if you want to contribute to this project.\n\n# What's new\nCheck out the [changelog](CHANGELOG.md) to see what's new\n\n[class-iquery]: ./src/Queries.Core/IQuery.cs\n[class-batch-query]: ./src/Queries.Core/Builders/BatchQuery.cs\n[class-select-query]: ./src/Queries.Core/Builders/SelectQuery.cs\n[class-update-query]: ./src/Queries.Core/Builders/UpdateQuery.cs\n[class-delete-query]: ./src/Queries.Core/Builders/DeleteQuery.cs\n[class-insert-query]: ./src/Queries.Core/Builders/InsertIntoQuery.cs\n[class-where-clause]: ./src/Queries.Core/Parts/Clauses/WhereClause.cs\n[class-iwhere-clause]: ./src/Queries.Core/Parts/Clauses/IWhereClause.cs\n[class-having-clause]: ./src/Queries.Core/Parts/Clauses/HavingClause.cs\n[class-ihaving-clause]: ./src/Queries.Core/Parts/Clauses/IHavingClause.cs\n[class-complex-where-clause]: ./src/Queries.Core/Parts/Clauses/CompositeWhereClause.cs\n[class-complex-having-clause]: ./src/Queries.Core/Parts/Clauses/CompositeHavingClause.cs\n[class-query-renderer-settings]: ./src/Queries.Core/Renderers/QueryRendererSettings.cs\n[class-builders-batch-query]: ./src/Queries.Core/Builders/BatchQuery.cs\n[class-columns-icolumn]: ./src/Queries.Core/Parts/Columns/IColumn.cs\n[class-columns-datetime]: ./src/Queries.Core/Parts/Columns/DateTimeColumn.cs\n[class-columns-boolean]: ./src/Queries.Core/Parts/Columns/BooleanColumn.cs\n[class-columns-string]: ./src/Queries.Core/Parts/Columns/StringColumn.cs\n[class-columns-datetime]: ./src/Queries.Core/Parts/Columns/DateTimeColumn.cs\n[class-columns-field]: ./src/Queries.Core/Parts/Columns/FieldColumn.cs","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcandoumbe%2Fqueries","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcandoumbe%2Fqueries","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcandoumbe%2Fqueries/lists"}