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 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 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));
        }
Esempio n. 4
0
 protected virtual Expression VisitSelectMany(SelectManyExpression node)
 {
     return base.VisitExtension(node);
 }