PoweredSoft.DynamicQuery | ||
PoweredSoft.DynamicQuery.AspNetCore | ||
PoweredSoft.DynamicQuery.Cli | ||
PoweredSoft.DynamicQuery.Core | ||
PoweredSoft.DynamicQuery.Test | ||
.gitattributes | ||
.gitignore | ||
DynamicQuery.sln | ||
LICENSE.md | ||
README.md |
Dynamic Query
It's a library that allows you to easily query a queryable using a criteria object.
It also offers, to intercept the query using IQueryInterceptor implementations.
Getting Started
Install nuget package to your awesome project.
Using in ASP.NET Core
The package Asp.net core of dynamic query will help you start to use Dynamic Query faster in your web project.
How to configure during startup
using PoweredSoft.DynamicQuery.AspNetCore;
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddDynamicQueryDefaultMappings();
var minimumDependencyServiceProvider = services.BuildServiceProvider();
services.AddMvc().AddDynamicQueryJsonConverter(minimumDependencyServiceProvider);
}
}
How to use in a controller
[HttpPost]
public IQueryExecutionResult Read(
[FromServices]YourContext context,
[FromServices]IQueryHandler handler,
[FromBody]IQueryCriteria criteria)
{
IQueryable<OfSomething> query = context.Somethings;
var result = handler.Execute(query, criteria);
return result;
}
Sample Web Project - ASP.NET CORE + EF Core
Visit: https://github.com/PoweredSoft/DynamicQueryAspNetCoreSample
Criteria
Criteria must implement the following interfaces
Object | Interface | Implementation | Example | Description |
---|---|---|---|---|
Query Criteria | interface | default implementation | test | Wraps the query parameters |
Paging | interface | default implementation | test | Paging support |
Filter | interface | default implementation | test | Represent a filter to be executed |
Simple Filter | interface | default implementation | test | Represent a simple filter to be executed |
Composite Filter | interface | default implementation | test | Represent a composite filter to be executed |
Sort | interface | default implementation | test | Represent a sort to be executed |
Group | interface | default implementation | test | Represent a group to be executed |
Aggregate | interface | default implementation | test | Represent an aggregate to be executed |
Sample
var criteria = new QueryCriteria
{
Page = 1,
PageSize = 12,
Filters = new List<IFilter>
{
new SimpleFilter { Path = "FirstName", Type = FilterType.Equal, Value = "John" }
}
};
var queryHandler = new QueryHandler();
IQueryExecutionResult result = queryHandler.Execute(someQueryable, criteria);
Query Result
Here is the interfaces that represent the result of query handling execution.
public interface IAggregateResult
{
string Path { get; set; }
AggregateType Type { get; set; }
object Value { get; set; }
}
public interface IQueryResult
{
List<IAggregateResult> Aggregates { get; }
List<object> Data { get; }
}
public interface IGroupQueryResult : IQueryResult
{
string GroupPath { get; set; }
object GroupValue { get; set; }
}
public interface IQueryExecutionResult : IQueryResult
{
long TotalRecords { get; set; }
long? NumberOfPages { get; set; }
}
Interceptors
Interceptors are meant to add hooks at certain part of the query handling to allow alteration of the criterias or the queryable it self.
The following is documented in the order of what they are called by the default query handler implementation.
Before the expression is being built
Interceptor | Interface | Example | Description |
---|---|---|---|
IIncludeStrategyInterceptor | interface | test | This is to allow you to specify include paths for the queryable |
IIncludeStrategyInterceptor<T> | interface | test | This is to allow you to specify include paths for the queryable |
IBeforeQueryFilterInterceptor | interface | test | Before adding the filters to the expression |
IBeforeQueryFilterInterceptor<T> | interface | test | Before adding the filters to the expression |
INoSortInterceptor | interface | test | This is called to allow you to specify an OrderBy in case none is specified, to avoid paging crash with EF6 |
INoSortInterceptor<T> | interface | test | This is called to allow you to specify an OrderBy in case none is specified, to avoid paging crash with EF6 |
After/During expression building before query execution
Interceptor | Interface | Example | Description |
---|---|---|---|
IFilterInterceptor | interface | test | This interceptor allows you to change the behavior of a IFilter being applied to the queryable |
ISortInterceptor | interface | test | This interceptor allows you to change the behavior of a ISort being applied to the queryable |
IGroupInterceptor | interface | test | This interceptor allows you to change the behavior of a IGroup being applied to the queryable |
IAggregateInterceptor | interface | test | This interceptor allows you to change the behavior of a IAggregate being applied to the queryable |
Post Query execution
Interceptor | Interface | Example | Description |
---|---|---|---|
IQueryConvertInterceptor | interface | test | This interceptor allows you to replace the object that is being returned by the query, by another object instance |
IQueryConvertInterceptor<T> | interface | test | This interceptor allows you to replace the object that is being returned by the query, by another object instance |