예제 #1
0
        public Task <LazyLoadingDataSetResult <TItem> > GetGroupedTablePageData(
            ILazyLoadingOptions lazyLoadingOptions, IPagingOptions pageableOptions,
            ISortingOptions sortingOptions, IGroupingOptions groupingOptions)
        {
            if (string.IsNullOrWhiteSpace(lazyLoadingOptions.DataUri))
            {
                throw new ArgumentNullException($"When you using {nameof(LazyLoadedTableDataAdapter<TItem>)} you must specify " +
                                                $"{nameof(LazyLoadingOptions.DataUri)} for lazy data retrieving. If you do not want use lazy loading feature use {nameof(CollectionTableDataAdapter<TItem>)} instead.");
            }

            var query = new QueryBuilder(lazyLoadingOptions.RequestParams);

            PagingParams(query, pageableOptions);
            SortingParams(query, sortingOptions);
            GroupingParams(query, groupingOptions);

            var dataUri = $"{lazyLoadingOptions.DataUri}{query.ToString()}";

            try
            {
                return(httpClient.GetJsonAsync <LazyLoadingDataSetResult <TItem> >(dataUri));
            }
            catch (Exception ex)
            {
                logger.LogError($"Error during fetching data from [{dataUri}]. Ex: {ex}");

                var emptyResult = new LazyLoadingDataSetResult <TItem>
                {
                    Items = Enumerable.Empty <TItem>().ToList()
                };

                return(Task.FromResult(emptyResult));
            }
        }
예제 #2
0
 private void GroupingParams(QueryBuilder builder, IGroupingOptions groupingOptions)
 {
     if (!string.IsNullOrWhiteSpace(groupingOptions.GroupedProperty?.Name))
     {
         builder.Add("groupExpression", groupingOptions.GroupedProperty.Name);
     }
 }
예제 #3
0
        public Task <LazyLoadingDataSetResult <WeatherForecast> > GetGroupedTablePageData(
            ILazyLoadingOptions lazyLoadingOptions, IPagingOptions pageableOptions,
            ISortingOptions sortingOptions, IGroupingOptions groupingOptions)
        {
            try
            {
                var items = staticRepositoryCollections.Forecasts.Values.AsQueryable();


                var param    = Expression.Parameter(typeof(WeatherForecast));
                var property = Expression.PropertyOrField(param, groupingOptions.GroupedProperty.Name);

                var keyPropertyConstructors = typeof(KeyProperty).GetConstructors();
                var newExpr = Expression.New(keyPropertyConstructors.FirstOrDefault(c => c.GetParameters()[0].ParameterType == property.Type)
                                             , property);
                var lambda       = Expression.Lambda <Func <WeatherForecast, KeyProperty> >(newExpr, param);
                var groupedItems = items.GroupBy(lambda)
                                   .Select(grp => new GroupItem <WeatherForecast>(grp.Key.Key, grp.ToList()));



                var groupedItemsAfterPaging = groupedItems
                                              .Skip(pageableOptions.PageSize * pageableOptions.CurrentPage)
                                              .Take(pageableOptions.PageSize);

                var groupedItemsAfterSorting = new List <GroupItem <WeatherForecast> >();
                var sortExp = sortingOptions?.SortExpression;
                if (!string.IsNullOrEmpty(sortExp))
                {
                    if (sortingOptions.SortDescending)
                    {
                        sortExp += " descending";
                    }

                    foreach (var groupItem in groupedItemsAfterPaging)
                    {
                        groupedItemsAfterSorting.Add(new GroupItem <WeatherForecast>(groupItem.Key,
                                                                                     groupItem.Items.AsQueryable().OrderBy(sortExp)));
                    }
                }
                else
                {
                    groupedItemsAfterSorting = groupedItemsAfterPaging.ToList();
                }


                return(Task.FromResult(new LazyLoadingDataSetResult <WeatherForecast>()
                {
                    Items = groupedItemsAfterSorting.SelectMany(grp => grp.Items).ToList(),
                    TotalCount = groupedItems.Count()
                }));
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
예제 #4
0
 public RequestOptions(
     ILazyLoadingOptions lazyLoadingOptions,
     IPagingOptions pageableOptions,
     ISortingOptions sortingOptions,
     IGroupingOptions groupingOptions)
 {
     this.LazyLoadingOptions = lazyLoadingOptions ?? throw new ArgumentNullException(nameof(lazyLoadingOptions));
     this.PageableOptions    = pageableOptions ?? throw new ArgumentNullException(nameof(pageableOptions));
     this.SortingOptions     = sortingOptions ?? throw new ArgumentNullException(nameof(sortingOptions));
     this.GroupingOptions    = groupingOptions ?? throw new ArgumentNullException(nameof(groupingOptions));
 }
예제 #5
0
 private void GroupingParams(QueryBuilder builder, IGroupingOptions groupingOptions)
 {
     builder.Add("groupExpression", groupingOptions.GroupedProperty.Name);
 }
예제 #6
0
 public Task <LazyLoadingDataSetResult <Order> > GetGroupedTablePageData(ILazyLoadingOptions lazyLoadingOptions, IPagingOptions pageableOptions, ISortingOptions sortingOptions, IGroupingOptions groupingOptions)
 {
     throw new NotImplementedException();
 }
        public static IQueryable <GroupItem <TItem> > ApplyFiltersWithGroupingToQueryable <TItem>(this IQueryable <TItem> source, ISortingOptions sortingOptions, IGroupingOptions groupingOptions, IPagingOptions pagingOptions)
        {
            var groupedItemsQueryable = ApplyGroupingToQueryable(source, groupingOptions.GroupedProperty.Name);

            groupedItemsQueryable         = ApplySortingToGroupedQueryable(groupedItemsQueryable, sortingOptions, groupingOptions);
            pagingOptions.TotalItemsCount = groupedItemsQueryable.Count();
            groupedItemsQueryable         = ApplyPagingToQueryable(groupedItemsQueryable, pagingOptions);
            return(groupedItemsQueryable);
        }
        public static IQueryable <GroupItem <TItem> > ApplySortingToGroupedQueryable <TItem>(this IQueryable <GroupItem <TItem> > queryable, ISortingOptions sortingOptions, IGroupingOptions groupingOptions)
        {
            if (string.IsNullOrEmpty(sortingOptions?.SortExpression))
            {
                return(queryable);
            }
            if (sortingOptions.SortExpression != groupingOptions.GroupedProperty.Name)
            {
                queryable = queryable.Select(x => new GroupItem <TItem>(x.Key,
                                                                        sortingOptions.SortDescending
                                                ? x.AsQueryable().OrderByDescending(sortingOptions.SortExpression)
                                                : x.AsQueryable().OrderBy(sortingOptions.SortExpression)));
                return(queryable);
            }

            return(sortingOptions.SortDescending
                                ? queryable.OrderByDescending(x => x.Key)
                                : queryable.OrderBy(x => x.Key));
        }
 public Task <LazyLoadingDataSetResult <TItem> > GetGroupedTablePageData(ILazyLoadingOptions lazyLoadingOptions, IPagingOptions pageableOptions, ISortingOptions sortingOptions, IGroupingOptions groupingOptions)
 => Task.FromResult(new LazyLoadingDataSetResult <TItem>()
 {
     Items      = new List <TItem>(),
     TotalCount = 0
 });