public static IReadOnlyList <SerializationExpression> Gather(Expression node)
        {
            var gatherer = new FieldGatherer();

            gatherer.Visit(node);
            return(gatherer._serializationExpressions);
        }
        protected override Expression VisitMethodCall(MethodCallExpression node)
        {
            if (!IsLinqMethod(node, "Select", "SelectMany"))
            {
                return(base.VisitMethodCall(node));
            }

            var source = node.Arguments[0] as SerializationExpression;

            if (source != null)
            {
                var fields = FieldGatherer.Gather(node.Arguments[1]);
                if (fields.Any(x => x.SerializationInfo.ElementName.StartsWith(source.SerializationInfo.ElementName)))
                {
                    _serializationExpressions.AddRange(fields);
                    return(node);
                }
            }

            return(base.VisitMethodCall(node));
        }