IWebQueryable and DefaultWebQueryRepository
The IWebQueryable interface defines a repository which accepts an ODATA query as inputs
and returns paged results:
{
Task<DataPage<D>> ExecuteQuery<D, Dext>(IWebQueryProvider query)
where Dext: D;
}
Where the IWebQueryProvider object contains the ODATA query. It is available through dependency
injection when the ODATA middleware is added. D is the data ViewModel whose properties
are used in the ODATA query, and Dext a subclass of it with further properties that contains grouped values,
that is returned in the paged results when the ODATA query contains groupings.
DefaultWebQueryRepository is the default implementation of IWebQueryable.
It acts as a wrapper that adds the ExecuteQuery method to any existing ICRUDRepository.
The ICRUDRepository to be wrapped is passed as the unique parameter of the DefaultWebQueryRepository
constructor. Below an example that shows how to use DefaultWebQueryRepository
private IWebQueryable oDataRepository;
public GridTestController(
Data.ApplicationDbContext db,
IStringLocalizerFactory factory,
IHttpContextAccessor accessor,
IWebQueryProvider queryProvider) :base(factory, accessor)
{
//in actual 3 layers applications repository inherit
//from DefaultCRUDRepository
//and then it is DI injected
Repository = DefaultCRUDRepository.Create(db, db.Products);
oDataRepository = new DefaultWebQueryRepository(Repository);
this.queryProvider = queryProvider;
}
public async Task<IActionResult> IndexEditDA()
{
queryProvider.OrderBy =
queryProvider.OrderBy ?? "Name asc";
queryProvider.Top = queryProvider.Top??"3";
var query = queryProvider.Parse<ProductViewModel>();
ProductlistViewModel model = new ProductlistViewModel
{
Query = query,
Products = await oDataRepository
.ExecuteQuery<ProductViewModel, ProductViewModelGrouping>
(queryProvider)
};
return View(model);
}
In case the query contains no sorting a default sorting must be added otherwise data cannot be paged
and the call to the ExecuteQuery method results into an InvalidOperationException
The same argument applies to queryProvider.Top that defines the page size.
Both instructions must preceed any other usage of queryProvider