コード例 #1
0
 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
                ));
 }
コード例 #2
0
        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);
        }