public static async Task <IEnumerable <TEntity> > Get <TEntity>(string tableName, QueryFactoryHelper queryFactoryHelper, IEnumerable <CompositeKey> ids) { var queryFactory = queryFactoryHelper.GetQueryFactory(); var whereIn = DataLoaderUtility.GetWhereIn(ids); const float maximumIdCount = 1000; var idCount = whereIn.First().Value.Length; var aggregatedResults = new List <TEntity>(); var totalPages = Math.Ceiling(idCount / maximumIdCount); for (var page = 0; page < totalPages; page++) { var batchedCompositeIds = new Dictionary <string, string[]>(); foreach (var(key, value) in whereIn) { batchedCompositeIds.Add(key, value.Skip((int)(page * maximumIdCount)).Take((int)maximumIdCount).ToArray()); } var query = queryFactory .Query(tableName); foreach (var(field, fieldIds) in batchedCompositeIds) { query.WhereIn(field, fieldIds); } var results = await query.GetAsync <TEntity>(); aggregatedResults.AddRange(results); } return(aggregatedResults); }
private void InitQuery <TFieldType, TModelType>(string tableName) where TFieldType : IGraphType { var entityName = typeof(TModelType).Name; FieldAsync <ResultType <TFieldType, TModelType> >( entityName.ToLowerInvariant(), arguments: new QueryArguments( new QueryArgument <ListGraphType <FilterGraphType> >() { Name = "filter", Description = "Filter by any field using standard operators" }, new QueryArgument <StringGraphType>() { Name = "orderBy", Description = "The name of the field to order by" }, new QueryArgument <NonNullGraphType <IntGraphType> >() { Name = "pageSize", Description = "Page size for pagination" }, new QueryArgument <IntGraphType>() { Name = "page", Description = "Page for pagination" } ), resolve: async context => { // get arguments var filters = context.GetArgument <List <Filter> >("filter")?.ToList() ?? new List <Filter>(); var orderBy = context.GetArgument <string>("orderBy"); // build query var queryFactory = _queryFactoryHelper.GetQueryFactory(); var query = queryFactory.Query(tableName); foreach (var item in filters) { if (!new[] { "in", "not in", "notin" }.Contains(item.Op.ToLower())) { query.Where(item.Field, item.Op, item.Value); } if (item.Op.ToLower() == "in") { query.WhereIn(item.Field, item.Value.Split(',').Select(_ => _.Trim())); } if (new[] { "not in", "notin" }.Contains(item.Op.ToLower())) { query.WhereNotIn(item.Field, item.Value.Split(',').Select(_ => _.Trim())); } } if (!string.IsNullOrEmpty(orderBy)) { query.OrderBy(orderBy); } // execute query return(await query.UseOffsetPaginationAsync <TModelType>(context)); } ); }