{"id":27147404,"url":"https://github.com/nikhilsarvaiye/DotnetStandardQueryBuilder","last_synced_at":"2025-04-08T11:26:04.943Z","repository":{"id":45976435,"uuid":"347010362","full_name":"nikhilsarvaiye/DotnetStandardQueryBuilder","owner":"nikhilsarvaiye","description":"A Odata compliant Query Builder built using Dotnet Standard 2.0 for MongoDB, SQL, Azure Cosmos Db, In Memory database","archived":false,"fork":false,"pushed_at":"2023-01-06T13:38:05.000Z","size":2549,"stargazers_count":11,"open_issues_count":5,"forks_count":7,"subscribers_count":3,"default_branch":"main","last_synced_at":"2025-03-23T10:15:29.512Z","etag":null,"topics":["cosmosdb","csharp","dotnetstandard","dotnetstandart20","memory","mongodb","odata","query","query-builder","sql"],"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/nikhilsarvaiye.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2021-03-12T09:26:58.000Z","updated_at":"2024-03-14T05:39:41.000Z","dependencies_parsed_at":"2023-02-06T04:32:17.693Z","dependency_job_id":null,"html_url":"https://github.com/nikhilsarvaiye/DotnetStandardQueryBuilder","commit_stats":null,"previous_names":["nikhilsarvaiye/querybuilder"],"tags_count":1,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nikhilsarvaiye%2FDotnetStandardQueryBuilder","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nikhilsarvaiye%2FDotnetStandardQueryBuilder/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nikhilsarvaiye%2FDotnetStandardQueryBuilder/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nikhilsarvaiye%2FDotnetStandardQueryBuilder/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/nikhilsarvaiye","download_url":"https://codeload.github.com/nikhilsarvaiye/DotnetStandardQueryBuilder/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247831929,"owners_count":21003485,"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":["cosmosdb","csharp","dotnetstandard","dotnetstandart20","memory","mongodb","odata","query","query-builder","sql"],"created_at":"2025-04-08T11:26:04.106Z","updated_at":"2025-04-08T11:26:04.935Z","avatar_url":"https://github.com/nikhilsarvaiye.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"# DotnetStandardQueryBuilder\n\nA Odata compliant Query Builder built using Dotnet Standard 2.0 for MongoDB, SQL, Azure Cosmos Db, In Memory database\n\n[Project](https://nikhilsarvaiye.github.io/DotnetStandardQueryBuilder/)\n\n![Architecture](_architecture.png)\n\n## Features\n\n1. Using [DotnetStandardQueryBuilder.Odata](https://www.nuget.org/packages/DotnetStandardQueryBuilder.Odata/) packages provides Odata compliant any Query String to Middleware Request object to further build query using available database query builders\n3. Support for [DotnetStandardQueryBuilder.Mongo](https://www.nuget.org/packages/DotnetStandardQueryBuilder.Mongo/) for Mongo Database\n3. Support for [DotnetStandardQueryBuilder.Sql](https://www.nuget.org/packages/DotnetStandardQueryBuilder.Sql/) for Sql Database\n3. Support for [DotnetStandardQueryBuilder.AzureCosmosSql](https://www.nuget.org/packages/DotnetStandardQueryBuilder.AzureCosmosSql/) for Azure Cosmos database for Sql Query\n4. Support for [DotnetStandardQueryBuilder.MemoryList](https://www.nuget.org/packages/DotnetStandardQueryBuilder.MemoryList/) for Memory List database\n\n### How to use\n\n1. Parsing Odata Query to Request Object\n\n    ```csharp\n    Install-Package DotnetStandardQueryBuilder.Core\n    Install-Package DotnetStandardQueryBuilder.Odata\n    ```\n    ```csharp\n    var request = new UriParser().Parse\u003cT\u003e('?$select=id\u0026$filter=(id eq 545648 and name='DotnetStandardQueryBuilder')\u0026top=10');\n    ```\n\n    Let's see how you can use it in web api\n\n    ```csharp\n    using DotnetStandardQueryBuilder.OData;\n    [ApiController]\n    [Route(\"[controller]\")]\n    public abstract class TestController\u003cT\u003e : ControllerBase\n    {\n        private readonly IService\u003cT\u003e _service;\n\n        public TestController(IService\u003cT\u003e service)\n        {\n            _service = service;\n        }\n\n        [HttpGet]\n        public async Task\u003cdynamic\u003e GetAsync()\n        {\n            var request = new UriParser().Parse\u003cT\u003e(Request.QueryString.ToString());\n\n            if (request.Count)\n            {\n                return await _service.PaginateAsync(request);\n            }\n\n            return await _service.GetAsync(request);\n        }\n    }\n    ```\n    The [DotnetStandardQueryBuilder.Odata](https://www.nuget.org/packages/DotnetStandardQueryBuilder.Odata/) packages uses [Microsoft.OData.Core](https://www.nuget.org/packages/Microsoft.OData.Core/) package internally to decouple ODataUriParser logic and map [ODataUriParser](https://docs.microsoft.com/en-us/dotnet/api/microsoft.odata.uriparser.odatauriparser?view=odata-core-7.0) objects to [Request](https://github.com/nikhilsarvaiye/DotnetStandardQueryBuilder/blob/main/DotnetStandardQueryBuilder.Core/IRequest.cs).\n\n2. Using [Request](https://github.com/nikhilsarvaiye/DotnetStandardQueryBuilder/blob/main/DotnetStandardQueryBuilder.Core/IRequest.cs) Object to build queries for Mongo,\n\n    ```csharp\n    var query = new MongoQueryBuilder\u003cT\u003e(request, _mongoCollection).Query();\n    ```\n\n    or you can simply use extension method\n\n    ```csharp\n    var query = _mongoCollection.Query(request);\n    ```\n\n    Example,\n\n    ```csharp\n    using MongoDB.Driver;\n    using DotnetStandardQueryBuilder.Core;\n    using System.Threading.Tasks;\n\n    public class BaseRepository\u003cT\u003e\n        where T : BaseModel\n    {\n        private readonly IMongoCollection\u003cT\u003e _mongoCollection;\n\n        public BaseRepository(IDbOptions dbOptions, string collectionName)\n        {\n            var client = new MongoClient(dbOptions.ConnectionString);\n            var database = client.GetDatabase(dbOptions.DatabaseName);\n\n            _mongoCollection = database.GetCollection\u003cT\u003e(collectionName);\n        }\n\n        public async Task\u003cList\u003cT\u003e\u003e GetAsync(IRequest request = null)\n        {\n            var query = new MongoQueryBuilder\u003cT\u003e(request, _mongoCollection).Query();\n\n            return await Task.FromResult(query.ToList());\n        }\n    }\n    ```\n\n3. Using [Request](https://github.com/nikhilsarvaiye/DotnetStandardQueryBuilder/blob/main/DotnetStandardQueryBuilder.Core/IRequest.cs) Object to build queries for Sql,\n\n    ```csharp\n    var tableName = \"Users\";\n    var sqlQueryBuilder = new SqlQueryBuilder(request, tableName);\n    \n    var sqlQuery = sqlQueryBuilder.Query();\n    \n    var sqlCountQuery = sqlQueryBuilder.QueryCount();\n    \n    var sqlCreateQuery = sqlQueryBuilder.CreateQuery\u003cT\u003e(new List\u003cT\u003e { }, new List\u003cstring\u003e { nameof(SampleModel.Id) });\n    \n    var sqlUpdateQuery = sqlQueryBuilder.UpdateQuery\u003cT\u003e(new List\u003cT\u003e { }, new List\u003cstring\u003e { nameof(SampleModel.Id) });\n    \n    var sqlDeleteQuery = sqlQueryBuilder.DeleteQuery();\n    ```\n\n    or you can simply use SqlExpression class and extension methods\n\n    ```csharp\n    var tableName = \"Users\";\n    var sqlExpression = new SqlExpression(request).Where().Select(tableName).OrderBy().Paginate();\n\n    var sqlExpression = new SqlExpression(request).Where().Select(tableName).OrderBy();\n    \n    var sqlQuery = request.DeleteQuery(_tableName);\n    ```\n\n    The output Sql Query class provides output as expression and both values in seperate properties so you can pass them directly to avoid SqlInjection\n    ```csharp \n    public class SqlQuery\n    {\n        public string Query { get; set; }\n\n        public Dictionary\u003cstring, object\u003e Values { get; set; }\n    }\n    ```\n\n    4. In the same way, you can build queries for Azure Cosmos Data for Sql Query,\n\n    ```csharp\n    var azureCosmosSqlQueryBuilder = new AzureCosmosSqlQueryBuilder(request);\n    var azureCosmosSqlQuery = azureCosmosSqlQueryBuilder.Query();\n    var azureCosmosCountSqlQuery = azureCosmosSqlQueryBuilder.QueryCount();\n    ```\n\n4. You can directly use [Request](https://github.com/nikhilsarvaiye/DotnetStandardQueryBuilder/blob/main/DotnetStandardQueryBuilder.Core/IRequest.cs) object to even build queries from service to service without dependant on Odata query string\n\n    ```csharp\n    var request = new Request\n    {\n        Filter = new CompositeFilter\n        {\n            LogicalOperator = LogicalOperator.And,\n            Filters = new List\u003cIFilter\u003e\n            {\n                new Filter\n                {\n                    Property = \"id\",\n                    Operator = FilterOperator.IsEqualTo,\n                    Value = 457785\n                },\n                new CompositeFilter\n                {\n                    LogicalOperator = LogicalOperator.Or,\n                    Filters = new List\u003cIFilter\u003e\n                    {\n                        new Filter\n                        {\n                            Property = \"firstName\",\n                            Operator = FilterOperator.Contains,\n                            Value = \"DotnetStandard\"\n                        },\n                        new Filter\n                        {\n                            Property = \"lastName\",\n                            Operator = FilterOperator.StartsWith,\n                            Value = \"QueryBuilder\"\n                        },\n                    }\n                },\n                age \u003e 10 \n                ?   new Filter\n                    {\n                        Property = \"name\",\n                        Operator = FilterOperator.IsNotEqualTo,\n                        Value = \"DotnetStandardQueryBuilder\"\n                    } \n                : null\n            }\n        },\n        Page = 2,\n        PageSize = 10,\n        Select = new List\u003cstring\u003e { \"id\", \"name\" },\n        Count = true\n    };\n    ```\n\n5. Using Memory List\n\n    Sometimes we can have a scenario where we have cached list data or list of items already in memory objects. Here you can use the [DotnetStandardQueryBuilder.MemoryList](https://www.nuget.org/packages/DotnetStandardQueryBuilder.MemoryList/) to query.\n    \n    ```csharp\n    var memoryList = new List\u003cSampleModel\u003e();\n    var memoryListQueryBuilder = new MemoryListQueryBuilder\u003cSampleModel\u003e(request, memoryList);\n    var memoryListQuery = memoryListQueryBuilder.Query();\n    var memoryListCountQuery = memoryListQueryBuilder.QueryCount();\n    ```\n\n    or you can simply use SqlExpression class and extension methods\n\n    ```csharp\n    var memoryList = new List\u003cSampleModel\u003e();\n    var sqlExpression = memoryList.Query(request);\n\n    var sqlExpression = memoryList.QueryCount(request);\n    ```\n\nThe package is newly created and aim to simplify query building, filtering using [DotnetStandardQueryBuilder.Odata](https://www.nuget.org/packages/DotnetStandardQueryBuilder.Odata/) and different database packages. \n\nFeel free contribute and raise PR's\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnikhilsarvaiye%2FDotnetStandardQueryBuilder","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnikhilsarvaiye%2FDotnetStandardQueryBuilder","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnikhilsarvaiye%2FDotnetStandardQueryBuilder/lists"}