Ejemplo n.º 1
0
        private static UI.TreeDataSourceResult CreateTreeDataSourceResult <TModel, T1, T2, TResult>(this IQueryable queryable, UI.DataSourceRequest request, Expression <Func <TModel, T1> > idSelector, Expression <Func <TModel, T2> > parentIDSelector, System.Web.Mvc.ModelStateDictionary modelState, Func <TModel, TResult> selector, Expression <Func <TModel, bool> > rootSelector)
        {
            var        result             = new UI.TreeDataSourceResult();
            IQueryable source             = queryable;
            List <IFilterDescriptor> list = new List <IFilterDescriptor>();

            if (request.Filters != null)
            {
                list.AddRange(request.Filters);
            }
            if (list.Any <IFilterDescriptor>())
            {
                source = source.Where(list).ParentsRecursive <TModel>(queryable, idSelector, parentIDSelector);
            }
            IQueryable allData = source;

            if (rootSelector != null)
            {
                source = source.Where(rootSelector);
            }
            List <SortDescriptor> list2 = new List <SortDescriptor>();

            if (request.Sorts != null)
            {
                list2.AddRange(request.Sorts);
            }
            List <AggregateDescriptor> list3 = new List <AggregateDescriptor>();

            if (request.Aggregates != null)
            {
                list3.AddRange(request.Aggregates);
            }
            if (list3.Any <AggregateDescriptor>())
            {
                IQueryable queryable4 = source;
                foreach (IGrouping <T2, TModel> grouping in queryable4.GroupBy(parentIDSelector))
                {
                    result.AggregateResults.Add(Convert.ToString(grouping.Key), grouping.AggregateForLevel <TModel, T1, T2>(allData, list3, idSelector, parentIDSelector));
                }
            }
            if (list2.Any <SortDescriptor>())
            {
                source = source.Sort(list2);
            }
            result.Data = source.Execute <TModel, TResult>(selector);
            if ((modelState != null) && !modelState.IsValid)
            {
                result.Errors = modelState.SerializeErrors();
            }
            return(result);
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Cria o resultado da origem de dados.
        /// </summary>
        /// <typeparam name="TModel">Tipo da model.</typeparam>
        /// <typeparam name="TResult">Tipo do resultado.</typeparam>
        /// <param name="queryable">Consulta.</param>
        /// <param name="request">Requisição.</param>
        /// <param name="modelState">Estado do modelo.</param>
        /// <param name="selector">Seletor.</param>
        /// <returns></returns>
        private static Colosoft.Web.Mvc.UI.DataSourceResult CreateDataSourceResult <TModel, TResult>(this IQueryable queryable, Mvc.UI.DataSourceRequest request, System.Web.Mvc.ModelStateDictionary modelState, Func <TModel, TResult> selector)
        {
            Func <AggregateDescriptor, IEnumerable <AggregateFunction> > func = null;
            Action <GroupDescriptor> action  = null;
            Action <GroupDescriptor> action2 = null;
            var        result  = new Mvc.UI.DataSourceResult();
            IQueryable source  = queryable;
            var        filters = new List <IFilterDescriptor>();

            if (request.Filters != null)
            {
                filters.AddRange(request.Filters);
            }
            if (filters.Any())
            {
                source = source.Where(filters);
            }
            var sorts = new List <SortDescriptor>();

            if (request.Sorts != null)
            {
                sorts.AddRange(request.Sorts);
            }
            var temporarySortDescriptors = new List <SortDescriptor>();
            var instance = new List <GroupDescriptor>();

            if (request.Groups != null)
            {
                instance.AddRange <GroupDescriptor>(request.Groups);
            }
            var aggregates = new List <AggregateDescriptor>();

            if (request.Aggregates != null)
            {
                aggregates.AddRange(request.Aggregates);
            }
            if (aggregates.Any())
            {
                IQueryable queryable3 = source.AsQueryable();
                IQueryable queryable4 = queryable3;
                if (filters.Any())
                {
                    queryable4 = queryable3.Where(filters);
                }
                if (func == null)
                {
                    func = a => a.Aggregates;
                }
                result.AggregateResults = queryable4.Aggregate(aggregates.SelectMany(func));
                if (instance.Any() && aggregates.Any())
                {
                    if (action == null)
                    {
                        action = delegate(GroupDescriptor g) {
                            foreach (var a in aggregates)
                            {
                                g.AggregateFunctions.AddRange(a.Aggregates);
                            }
                        };
                    }
                    instance.Each(action);
                }
            }
            result.Total = source.Count();
            if (!sorts.Any() && queryable.Provider.IsEntityFrameworkProvider())
            {
                var descriptor = new SortDescriptor {
                    Member = queryable.ElementType.FirstSortableProperty()
                };
                sorts.Add(descriptor);
                temporarySortDescriptors.Add(descriptor);
            }
            if (instance.Any())
            {
                if (action2 == null)
                {
                    action2 = delegate(GroupDescriptor groupDescriptor) {
                        var item = new SortDescriptor {
                            Member        = groupDescriptor.Member,
                            SortDirection = groupDescriptor.SortDirection
                        };
                        sorts.Insert(0, item);
                        temporarySortDescriptors.Add(item);
                    };
                }
                instance.Reverse <GroupDescriptor>().Each <GroupDescriptor>(action2);
            }
            if (sorts.Any())
            {
                source = source.Sort(sorts);
            }
            IQueryable notPagedData = source;

            source = source.Page(request.Page - 1, request.PageSize);
            if (instance.Any())
            {
                source = source.GroupBy(notPagedData, instance);
            }
            result.Data = source.Execute <TModel, TResult>(selector);
            if ((modelState != null) && !modelState.IsValid)
            {
                result.Errors = modelState.SerializeErrors();
            }
            temporarySortDescriptors.Each(sortDescriptor => sorts.Remove(sortDescriptor));
            return(result);
        }