private static async Task <SearchSCIMRepresentationsResponse> EvaluateOrderByProperty(
            SCIMDbContext dbContext,
            SCIMAttributeExpression attrExpression,
            IQueryable <SCIMRepresentationModel> representations,
            SearchSCIMRepresentationOrders order,
            int startIndex,
            int count,
            CancellationToken cancellationToken)
        {
            var lastChild = attrExpression.GetLastChild();
            var query     = from rep in (from s in representations
                                         join attr in dbContext.SCIMRepresentationAttributeLst on s.Id equals attr.RepresentationId
                                         join attrv in dbContext.SCIMRepresentationAttributeValueLst on attr.Id equals attrv.SCIMRepresentationAttributeId
                                         select new
            {
                representation = s,
                representationId = s.Id,
                orderedValue = (lastChild.SchemaAttribute.Id == attr.SchemaAttributeId) ? attrv.ValueString : ""
            })
                            orderby rep.orderedValue descending
                            select rep.representationId;
            var orderedIds = await query.Skip(startIndex).Take(count).ToListAsync(cancellationToken);

            var result = await dbContext.SCIMRepresentationLst.Where(s => orderedIds.Contains(s.Id)).ToListAsync(cancellationToken);

            var comparer = new RepresentationComparer(orderedIds);
            List <SCIMRepresentationModel> content = null;

            switch (order)
            {
            case SearchSCIMRepresentationOrders.Ascending:
                content = result.OrderBy(r => r, comparer).ToList();
                break;

            case SearchSCIMRepresentationOrders.Descending:
                content = result.OrderByDescending(r => r, comparer).ToList();
                break;
            }

            var total = await representations.CountAsync(cancellationToken);

            return(new SearchSCIMRepresentationsResponse(total, content.Select(r => r.ToDomain())));
        }
Exemple #2
0
        private static SearchSCIMRepresentationsResponse EvaluateOrderByProperty(
            SCIMDbContext dbContext,
            SCIMAttributeExpression attrExpression,
            IQueryable <SCIMRepresentation> representations,
            SearchSCIMRepresentationOrders order,
            int startIndex,
            int count,
            IEnumerable <SCIMAttributeExpression> includedAttributes,
            IEnumerable <SCIMAttributeExpression> excludedAttributes)
        {
            int total     = representations.Count();
            var lastChild = attrExpression.GetLastChild();
            var result    = from s in representations
                            join attr in dbContext.SCIMRepresentationAttributeLst on s.Id equals attr.RepresentationId
                            select new
            {
                Attr         = attr,
                Rep          = s,
                orderedValue = (lastChild.SchemaAttribute.Id == attr.SchemaAttributeId) ? attr.ValueString : ""
            };

            switch (order)
            {
            case SearchSCIMRepresentationOrders.Ascending:
                result = result.OrderBy(q => q.orderedValue);
                break;

            case SearchSCIMRepresentationOrders.Descending:
                result = result.OrderByDescending(q => q.orderedValue);
                break;
            }

            var content = result.Select(r => r.Rep).Skip(startIndex <= 1 ? 0 : startIndex - 1).Take(count);

            return(BuildResult(content, dbContext, includedAttributes, excludedAttributes, total));
        }
        public static LambdaExpression EvaluateOrderByProperty(SCIMAttributeExpression attrExpression, IQueryable <SCIMRepresentation> representations, SearchSCIMRepresentationOrders order)
        {
            var lastChild     = attrExpression.GetLastChild();
            var lastChildType = MAPPING_SCHEMATTR_TO_TYPES[lastChild.SchemaAttribute.Type];
            var orderBy       = GetOrderByType(order, lastChildType);
            var selectMany    = typeof(Enumerable).GetMethods()
                                .Where(m => m.Name == "SelectMany" && m.IsGenericMethod)
                                .Where(m => m.GetParameters().Count() == 2).First().MakeGenericMethod(typeof(SCIMRepresentationAttribute), typeof(SCIMRepresentationAttribute));
            var first = typeof(Enumerable).GetMethods()
                        .Where(m => m.Name == "First" && m.IsGenericMethod)
                        .Where(m => m.GetParameters().Count() == 2).First().MakeGenericMethod(typeof(SCIMRepresentationAttribute));
            var firstOrDefault = typeof(Enumerable).GetMethods()
                                 .Where(m => m.Name == "FirstOrDefault" && m.IsGenericMethod)
                                 .Where(m => m.GetParameters().Count() == 1).First();
            var        representationParameter = Expression.Parameter(typeof(SCIMRepresentation), "rp");
            var        attributesProperty      = Expression.Property(representationParameter, "Attributes");
            Expression navigationProperty      = attributesProperty;
            Expression innerExpression         = null;
            var        nbChildren = attrExpression.NbChildren();

            if (nbChildren >= 1)
            {
                for (int i = nbChildren - 1; i >= 0; i--)
                {
                    var representationAttributeParameter = Expression.Parameter(typeof(SCIMRepresentationAttribute), $"a{i}");
                    var valuesProperty = Expression.Property(representationAttributeParameter, "Values");
                    if (innerExpression != null)
                    {
                        var selectManyExpression = Expression.Call(selectMany, valuesProperty, innerExpression);
                        innerExpression = Expression.Lambda(selectManyExpression, new ParameterExpression[] { representationAttributeParameter });
                    }
                    else
                    {
                        var lambda = Expression.Lambda(valuesProperty, new ParameterExpression[] { representationAttributeParameter });
                        innerExpression = lambda;
                    }
                }
            }

            if (innerExpression != null)
            {
                var selectExpr = Expression.Call(selectMany, attributesProperty, innerExpression);
                navigationProperty = selectExpr;
            }

            var        att              = Expression.Parameter(typeof(SCIMRepresentationAttribute), "att");
            var        schemaAttrProp   = Expression.Property(att, "SchemaAttribute");
            var        schemaAttrIdProp = Expression.Property(schemaAttrProp, "Id");
            var        equal            = Expression.Equal(schemaAttrIdProp, Expression.Constant(lastChild.SchemaAttribute.Id));
            var        equalLambda      = Expression.Lambda(equal, new ParameterExpression[] { att });
            var        firstCall        = Expression.Call(first, navigationProperty, equalLambda);
            Expression property         = null;

            switch (lastChild.SchemaAttribute.Type)
            {
            case SCIMSchemaAttributeTypes.STRING:
                property = Expression.Property(firstCall, "ValuesString");
                break;
            }

            var innerLambda           = Expression.Call(firstOrDefault.MakeGenericMethod(lastChildType), property);
            var orderLambda           = Expression.Lambda(innerLambda, new ParameterExpression[] { representationParameter });
            var orderExpr             = Expression.Call(orderBy, Expression.Constant(representations), orderLambda);
            var finalSelectArg        = Expression.Parameter(typeof(IQueryable <SCIMRepresentation>), "f");
            var finalOrderRequestBody = Expression.Lambda(orderExpr, new ParameterExpression[] { finalSelectArg });

            return(finalOrderRequestBody);
        }