public async Task <ActionResult <IEnumerable> > GetGroupped([FromBody] GrouppedListRequest request) { if (!_permissionService.IsAllowed(new ActionRequestInfo(HttpContext, _implementationsContainer, request.EntityTypeName, ActionTypeEnum.Select))) { return(Unauthorized()); } return(new ActionResult <IEnumerable>(await _entityHandler.GetGroupped(request))); }
public async Task <IEnumerable> GetGroupped(GrouppedListRequest request) { var entityType = _implementationsContainer.Reflector.GetType(request.EntityTypeName); var method = _handlerInternal.GetType().GetMethod(nameof(EfCoreEntityHandlerInternal.GetGrouppedInternal), BindingFlags.NonPublic | BindingFlags.Instance).MakeGenericMethod(entityType); var r = this.GetType().GetMethod(nameof(CreateGenericGroupRequest), BindingFlags.NonPublic | BindingFlags.Instance).MakeGenericMethod(entityType) .Invoke(this, new object[] { request }); var awaitable = method.Invoke(_handlerInternal, new object[] { r }) as Task <IEnumerable>; return(await awaitable); }
private GrouppedListRequest <TEntity> CreateGenericGroupRequest <TEntity>(GrouppedListRequest request) { return(new GrouppedListRequest <TEntity>() { Order = request.Order, StartIndex = request.StartIndex, Count = request.Count, Aggregations = request.Aggregations, GroupBy = request.GroupBy, Filters = request.Filters?.Select(x => FilterNodeConverter.ToExpression <TEntity>(x, _implementationsContainer.Reflector)).ToArray() }); }
internal async Task <int> CountGroupsInternal <TEntity>(GrouppedListRequest <TEntity> request) where TEntity : class { using (var context = await GetReadBusinessDbContext()) { var original = QueryBuilder.CreateSelectQuery(request, context); var query = QueryBuilder.GroupQuery(request, original, out var grouppedItemType); var countMethod = typeof(EntityFrameworkQueryableExtensions).GetMethods() .Single(x => x.Name == nameof(EntityFrameworkQueryableExtensions.CountAsync) && x.GetParameters().Length == 1); countMethod = countMethod.MakeGenericMethod(grouppedItemType); var task = countMethod.Invoke(null, new object[] { query }) as Task <int>; return(await task); } }