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); }
/// <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); }