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