private List <JObject> QueryJoiningContainer(QueriedEntity joinedEntity, IEnumerable <JToken> propertyValues) { var containerName = joinedEntity.EntityName; var container = EnsureContainer(containerName); //HACK: pretty limited way to query lots of entities by individual Id var counter = 0; var query = propertyValues.Select(propertyValue => new WhereExpression { Condition = new WhereCondition { FieldName = joinedEntity.Join.Right.JoinedFieldName, Operator = ConditionOperator.EqualTo, Value = propertyValue.ToObject <object>() }, Operator = counter++ == 0 ? LogicalOperator.None : LogicalOperator.Or }).ToList().ToAzureCosmosSqlApiWhereClause(); var selectedPropertyNames = joinedEntity.Selects .Where(sel => sel.JoinedFieldName.HasValue()) .Select(j => j.JoinedFieldName) .Concat(new[] { joinedEntity.Join.Right.JoinedFieldName, IdentifierPropertyName }); var selectedFields = string.Join(", ", selectedPropertyNames .Select(name => $"{PrimaryContainerAlias}.{name}")); var filter = $"SELECT {selectedFields} FROM {containerName} {PrimaryContainerAlias} WHERE ({query})"; var containerQuery = new QueryDefinition(filter); return(container.GetItemQueryIterator <object>(containerQuery) .ToList()); }
private static Dictionary <string, QueryEntity> QueryJoiningContainer(IRedisClient client, QueriedEntity joinedEntity) { var containerName = joinedEntity.EntityName; if (!Exists(client, containerName)) { return(new Dictionary <string, QueryEntity>()); } var metadata = RepositoryEntityMetadata.FromType(joinedEntity.Join.Right.EntityType); return(GetRowKeys(client, containerName) .ToDictionary(rowKey => rowKey, rowKey => QueryEntity.FromProperties(GetEntityFromContainer(client, rowKey, metadata), metadata))); }
private Dictionary <string, IReadOnlyDictionary <string, object> > QueryJoiningContainer(QueriedEntity je, RepositoryEntityMetadata metadata) { var containerName = je.EntityName; var container = EnsureContainer(containerName); var selected = je.Selects .Where(sel => sel.JoinedFieldName.HasValue()) .ToList(); if (!selected.Any(sel => sel.EntityName.EqualsOrdinal(je.Join.Right.EntityName))) { selected.Add(new SelectDefinition(je.Join.Right.EntityName, je.Join.Right.JoinedFieldName, null, null)); } var filter = selected.ToCosmosSqlApiSelectClause(containerName); this.recorder.TraceInformation($"Executed SQL statement: {filter}"); return(container.GetItemQueryIterator <object>(new QueryDefinition(filter)) .ToList() .ToDictionary(jObj => jObj.Property(IdentifierPropertyName).Value.ToString(), jObj => jObj.FromContainerEntity(metadata))); }