static RemoteGroupingResult ExecRemoteGrouping <T>(IQueryable <T> source, DataSourceExpressionBuilder <T> builder, DataSourceLoadOptionsBase options) { return(RemoteGroupTransformer.Run( ExecQuery(builder.BuildLoadGroupsExpr().Compile(), source, options), options.HasGroups ? options.Group.Length : 0, options.TotalSummary, options.GroupSummary )); }
public static object Load <T>(IQueryable <T> source, DataSourceLoadOptionsBase options) { var isLinqToObjects = source is EnumerableQuery; var builder = new DataSourceExpressionBuilder <T>(options, isLinqToObjects); if (options.IsCountQuery) { return(builder.BuildCountExpr().Compile()(source)); } var accessor = new DefaultAccessor <T>(); var result = new DataSourceLoadResult(); var emptyGroups = options.HasGroups && !options.Group.Last().GetIsExpanded(); var canUseRemoteGrouping = options.RemoteGrouping.HasValue ? options.RemoteGrouping.Value : !isLinqToObjects; if (canUseRemoteGrouping && emptyGroups) { var groupingResult = ExecRemoteGrouping(source, builder, options); EmptyGroups(groupingResult.Groups, options.Group.Length); result.data = Paginate(groupingResult.Groups, options.Skip, options.Take); result.summary = groupingResult.Totals; result.totalCount = groupingResult.TotalCount; if (options.RequireGroupCount) { result.groupCount = groupingResult.Groups.Count(); } } else { if (!options.HasPrimaryKey) { options.PrimaryKey = Utils.GetPrimaryKey(typeof(T)); } if (!options.HasPrimaryKey && (options.Skip > 0 || options.Take > 0) && Compat.IsEntityFramework(source.Provider)) { options.DefaultSort = EFSorting.FindSortableMember(typeof(T)); } var deferPaging = options.HasGroups || options.HasSummary && !canUseRemoteGrouping; var queryResult = ExecQuery(builder.BuildLoadExpr(!deferPaging).Compile(), source, options); IEnumerable data = queryResult; if (options.HasGroups) { data = new ContosoRetail.SharedKernel.DataAccess.DataLoader.GroupHelper <T>(accessor).Group(queryResult, options.Group); if (options.RequireGroupCount) { result.groupCount = (data as IList).Count; } } if (canUseRemoteGrouping && options.HasSummary && !options.HasGroups) { var groupingResult = ExecRemoteGrouping(source, builder, options); result.totalCount = groupingResult.TotalCount; result.summary = groupingResult.Totals; } else { if (options.RequireTotalCount) { result.totalCount = builder.BuildCountExpr().Compile()(source); } if (options.HasSummary) { data = Buffer <T>(data); result.summary = new ContosoRetail.SharedKernel.DataAccess.DataLoader.Aggregation.AggregateCalculator <T>(data, accessor, options.TotalSummary, options.GroupSummary).Run(); } } if (deferPaging) { data = Paginate(data, options.Skip, options.Take); } if (emptyGroups) { EmptyGroups(data, options.Group.Length); } result.data = data; } if (result.IsDataOnly()) { return(result.data); } return(result); }