private void VisitSelectMany(SelectManyExpression node) { Visit(node.Source); var field = node.CollectionSelector as ISerializationExpression; if (field == null || field.SerializationInfo.ElementName == null) { var message = string.Format("The collection selector must be an ISerializationExpression: {0}", node.ToString()); throw new NotSupportedException(message); } _stages.Add(new BsonDocument("$unwind", "$" + field.SerializationInfo.ElementName)); var projection = AggregateProjectionTranslator.TranslateProject(node.ResultSelector); _stages.Add(new BsonDocument("$project", projection)); }
private void TranslateSelectMany(SelectManyExpression node) { Translate(node.Source); var isLeftOuterJoin = false; IFieldExpression field; var collectionSelector = node.CollectionSelector as PipelineExpression; if (collectionSelector != null) { var defaultIfEmpty = collectionSelector.Source as DefaultIfEmptyExpression; if (defaultIfEmpty != null) { isLeftOuterJoin = true; field = defaultIfEmpty.Source as IFieldExpression; } else { field = collectionSelector.Source as IFieldExpression; } } else { field = node.CollectionSelector as IFieldExpression; } if (field == null) { var message = string.Format("The collection selector must be a field: {0}", node.ToString()); throw new NotSupportedException(message); } BsonValue unwindValue = "$" + field.FieldName; var groupJoin = node.Source as GroupJoinExpression; if (groupJoin != null && isLeftOuterJoin) { unwindValue = new BsonDocument { { "path", unwindValue }, { "preserveNullAndEmptyArrays", true } }; } _stages.Add(new BsonDocument("$unwind", unwindValue)); var projectValue = TranslateProjectValue(node.ResultSelector); _stages.Add(new BsonDocument("$project", projectValue)); }
private void TranslateSelectMany(SelectManyExpression node) { Translate(node.Source); var field = node.CollectionSelector as IFieldExpression; if (field == null) { var message = string.Format("The collection selector must be a field: {0}", node.ToString()); throw new NotSupportedException(message); } _stages.Add(new BsonDocument("$unwind", "$" + field.FieldName)); var projectValue = TranslateProjectValue(node.ResultSelector); _stages.Add(new BsonDocument("$project", projectValue)); }