DotnetStandardQueryBuilder.OData
1.0.3
See the version list below for details.
dotnet add package DotnetStandardQueryBuilder.OData --version 1.0.3
NuGet\Install-Package DotnetStandardQueryBuilder.OData -Version 1.0.3
<PackageReference Include="DotnetStandardQueryBuilder.OData" Version="1.0.3" />
paket add DotnetStandardQueryBuilder.OData --version 1.0.3
#r "nuget: DotnetStandardQueryBuilder.OData, 1.0.3"
// Install DotnetStandardQueryBuilder.OData as a Cake Addin #addin nuget:?package=DotnetStandardQueryBuilder.OData&version=1.0.3 // Install DotnetStandardQueryBuilder.OData as a Cake Tool #tool nuget:?package=DotnetStandardQueryBuilder.OData&version=1.0.3
DotnetStandardQueryBuilder
A Odata compliant Query Builder built using Dotnet Standard 2.0 for MongoDB, SQL, Azure Cosmos Db database
Features
- Using DotnetStandardQueryBuilder.Odata packages provides Odata compliant any Query String to Middleware Request object to further build query using available database query builders
- Support for DotnetStandardQueryBuilder.Mongo for Mongo Database
- Support for DotnetStandardQueryBuilder.Sql for Sql Database
- Support for DotnetStandardQueryBuilder.AzureCosmosSql for Azure Cosmos database for Sql Query
How to use
Parsing Odata Query to Request Object
Install-Package DotnetStandardQueryBuilder.Core Install-Package DotnetStandardQueryBuilder.Odata
var request = new UriParser().Parse<T>('?$select=id&$filter=(id eq 545648 and name='DotnetStandardQueryBuilder')&top=10');
Let's see how you can use it in web api
using DotnetStandardQueryBuilder.OData; [ApiController] [Route("[controller]")] public abstract class TestController<T> : ControllerBase { private readonly IService<T> _service; public TestController(IService<T> service) { _service = service; } [HttpGet] public async Task<dynamic> GetAsync() { var request = new UriParser().Parse<T>(Request.QueryString.ToString()); if (request.Count) { return await _service.PaginateAsync(request); } return await _service.GetAsync(request); } }
Using Request Object to build queries for Mongo,
var query = new MongoQueryBuilder<T>(request, _mongoCollection).Query();
or you can simply use extension method
var query = _mongoCollection.Query(request);
Example,
using MongoDB.Driver; using DotnetStandardQueryBuilder.Core; using System.Threading.Tasks; public class BaseRepository<T> where T : BaseModel { private readonly IMongoCollection<T> _mongoCollection; public BaseRepository(IDbOptions dbOptions, string collectionName) { var client = new MongoClient(dbOptions.ConnectionString); var database = client.GetDatabase(dbOptions.DatabaseName); _mongoCollection = database.GetCollection<T>(collectionName); } public async Task<List<T>> GetAsync(IRequest request = null) { var query = new MongoQueryBuilder<T>(request, _mongoCollection).Query(); return await Task.FromResult(query.ToList()); } }
Using Request Object to build queries for Sql,
var tableName = "Users"; var sqlQueryBuilder = new SqlQueryBuilder(request, tableName); var sqlQuery = sqlQueryBuilder.Query(); var sqlCountQuery = sqlQueryBuilder.QueryCount();
or you can simply use SqlExpression class and extension methods
var tableName = "Users"; var sqlExpression = new SqlExpression(request).Where().Select(tableName).OrderBy().Paginate(); var sqlExpression = new SqlExpression(request).Where().Select(tableName).OrderBy();
The output Sql Query class provides output as expression and both values in seperate properties so you can pass them directly to avoid SqlInjection
public class SqlQuery { public string Query { get; set; } public Dictionary<string, object> Values { get; set; } }
- In the same way, you can build queries for Azure Cosmos Data for Sql Query,
var azureCosmosSqlQueryBuilder = new AzureCosmosSqlQueryBuilder(request); var azureCosmosSqlQuery = azureCosmosSqlQueryBuilder.Query(); var azureCosmosCountSqlQuery = azureCosmosSqlQueryBuilder.QueryCount();
You can directly use Request object to even build queries from service to service without dependant on Odata query string
var request = new Request { Filter = new CompositeFilter { LogicalOperator = LogicalOperator.And, Filters = new List<IFilter> { new Filter { Property = "id", Operator = FilterOperator.IsEqualTo, Value = 457785 }, new CompositeFilter { LogicalOperator = LogicalOperator.Or, Filters = new List<IFilter> { new Filter { Property = "firstName", Operator = FilterOperator.Contains, Value = "DotnetStandard" }, new Filter { Property = "lastName", Operator = FilterOperator.StartsWith, Value = "QueryBuilder" }, } }, age > 10 ? new Filter { Property = "name", Operator = FilterOperator.IsNotEqualTo, Value = "DotnetStandardQueryBuilder" } : null } }, Page = 2, PageSize = 10, Select = new List<string> { "id", "name" }, Count = true };
Request Class
public class Request { public int Page { get; set; } = 1; public int? PageSize { get; set; } public bool Count { get; set; } public IFilter Filter { get; set; } public List<Sort> Sorts { get; set; } public List<string> Select { get; set; } public bool Distinct { get; set; } }
Feel free contribute and raise PR's
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net5.0 was computed. net5.0-windows was computed. net6.0 was computed. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. |
.NET Core | netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
.NET Standard | netstandard2.0 is compatible. netstandard2.1 was computed. |
.NET Framework | net461 was computed. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 was computed. net481 was computed. |
MonoAndroid | monoandroid was computed. |
MonoMac | monomac was computed. |
MonoTouch | monotouch was computed. |
Tizen | tizen40 was computed. tizen60 was computed. |
Xamarin.iOS | xamarinios was computed. |
Xamarin.Mac | xamarinmac was computed. |
Xamarin.TVOS | xamarintvos was computed. |
Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETStandard 2.0
- DotnetStandardQueryBuilder.Core (>= 1.0.3)
- Microsoft.AspNetCore.OData (>= 7.5.5)
- Microsoft.OData.Core (>= 7.8.3)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
Version | Downloads | Last updated |
---|---|---|
1.1.3 | 1,368 | 1/6/2023 |
1.1.2 | 1,075 | 4/8/2021 |
1.1.1 | 513 | 4/2/2021 |
1.1.0 | 481 | 3/18/2021 |
1.0.9 | 380 | 3/18/2021 |
1.0.8 | 397 | 3/15/2021 |
1.0.7 | 381 | 3/14/2021 |
1.0.6 | 434 | 3/14/2021 |
1.0.5 | 421 | 3/13/2021 |
1.0.4 | 482 | 3/13/2021 |
1.0.3 | 490 | 3/13/2021 |
1.0.2 | 412 | 3/12/2021 |
1.0.1 | 422 | 3/12/2021 |
1.0.0 | 431 | 3/12/2021 |
A OData compliant QueyBuilder for net and aspnet core application for different MongoDB, SQL databases