private IEnumerable <TResource> GetWhereAndInclude <TResource, TId>(IReadOnlyCollection <TId> ids, RelationshipAttribute[] relationshipsToNextLayer) where TResource : class, IIdentifiable <TId> { if (!ids.Any()) { return(Array.Empty <TResource>()); } var resourceContext = _resourceContextProvider.GetResourceContext <TResource>(); var filterExpression = CreateFilterByIds(ids, resourceContext); var queryLayer = new QueryLayer(resourceContext) { Filter = filterExpression }; var chains = relationshipsToNextLayer.Select(relationship => new ResourceFieldChainExpression(relationship)).ToList(); if (chains.Any()) { queryLayer.Include = IncludeChainConverter.FromRelationshipChains(chains); } var repository = GetRepository <TResource, TId>(); return(repository.GetAsync(queryLayer, CancellationToken.None).Result); }
public override Expression VisitInclude(IncludeExpression expression, object argument) { var source = ApplyEagerLoads(_source, _resourceContext.EagerLoads, null); foreach (ResourceFieldChainExpression chain in IncludeChainConverter.GetRelationshipChains(expression)) { source = ProcessRelationshipChain(chain, source); } return(source); }
private IEnumerable <IQueryConstraintProvider> GetIncludeConstraints(IEnumerable <IEnumerable <RelationshipAttribute> > inclusionChains = null) { var expressionsInScope = new List <ExpressionInScope>(); if (inclusionChains != null) { var chains = inclusionChains.Select(relationships => new ResourceFieldChainExpression(relationships.ToArray())).ToList(); var includeExpression = IncludeChainConverter.FromRelationshipChains(chains); expressionsInScope.Add(new ExpressionInScope(null, includeExpression)); } var mock = new Mock <IQueryConstraintProvider>(); mock.Setup(x => x.GetConstraints()).Returns(expressionsInScope); IQueryConstraintProvider includeConstraintProvider = mock.Object; return(includeConstraintProvider.AsEnumerable()); }
protected IncludeExpression ParseInclude(int?maximumDepth) { ResourceFieldChainExpression firstChain = ParseFieldChain(FieldChainRequirements.IsRelationship, "Relationship name expected."); var chains = firstChain.AsList(); while (TokenStack.Any()) { EatSingleCharacterToken(TokenKind.Comma); var nextChain = ParseFieldChain(FieldChainRequirements.IsRelationship, "Relationship name expected."); chains.Add(nextChain); } ValidateMaximumIncludeDepth(maximumDepth, chains); return(IncludeChainConverter.FromRelationshipChains(chains)); }
public override Expression VisitInclude(IncludeExpression expression, object argument) { var source = ApplyEagerLoads(_source, _resourceContext.EagerLoads, null); foreach (ResourceFieldChainExpression chain in IncludeChainConverter.GetRelationshipChains(expression)) { string path = null; foreach (var relationship in chain.Fields.Cast <RelationshipAttribute>()) { path = path == null ? relationship.RelationshipPath : path + "." + relationship.RelationshipPath; var resourceContext = _resourceContextProvider.GetResourceContext(relationship.RightType); source = ApplyEagerLoads(source, resourceContext.EagerLoads, path); } source = IncludeExtensionMethodCall(source, path); } return(source); }
private IEnumerable <TResource> GetWhereAndInclude <TResource, TId>(IEnumerable <TId> ids, RelationshipAttribute[] relationshipsToNextLayer) where TResource : class, IIdentifiable <TId> { var resourceContext = _resourceContextProvider.GetResourceContext <TResource>(); var idAttribute = resourceContext.Attributes.Single(attr => attr.Property.Name == nameof(Identifiable.Id)); var queryLayer = new QueryLayer(resourceContext) { Filter = new EqualsAnyOfExpression(new ResourceFieldChainExpression(idAttribute), ids.Select(id => new LiteralConstantExpression(id.ToString())).ToList()) }; var chains = relationshipsToNextLayer.Select(relationship => new ResourceFieldChainExpression(relationship)).ToList(); if (chains.Any()) { queryLayer.Include = IncludeChainConverter.FromRelationshipChains(chains); } var repository = GetRepository <TResource, TId>(); return(repository.GetAsync(queryLayer).Result); }