protected override void Exporting(QueryPart part, ExportContentContext context)
        {
            var element = context.Element(part.PartDefinition.Name);

            element.Add(
                new XElement("FilterGroups",
                             part.FilterGroups.Select(filterGroup =>
                                                      new XElement("FilterGroup",
                                                                   filterGroup.Filters.Select(filter => {
                var descriptor = _projectionManager.GetFilter(filter.Category, filter.Type);

                var state = filter.State;
                if (descriptor != null)
                {
                    state = _formManager.Export(descriptor.Form, filter.State, context);
                }

                return(new XElement("Filter",
                                    new XAttribute("Category", filter.Category ?? ""),
                                    new XAttribute("Description", filter.Description ?? ""),
                                    new XAttribute("Position", filter.Position),
                                    new XAttribute("State", state ?? ""),
                                    new XAttribute("Type", filter.Type ?? "")
                                    ));
            })
                                                                   )
                                                      )
                             ),
                new XElement("SortCriteria",
                             part.SortCriteria.Select(sortCriterion => {
                var descriptor = _projectionManager.GetFilter(sortCriterion.Category, sortCriterion.Type);

                var state = sortCriterion.State;
                if (descriptor != null)
                {
                    state = _formManager.Export(descriptor.Form, sortCriterion.State, context);
                }

                return(new XElement("SortCriterion",
                                    new XAttribute("Category", sortCriterion.Category ?? ""),
                                    new XAttribute("Description", sortCriterion.Description ?? ""),
                                    new XAttribute("Position", sortCriterion.Position),
                                    new XAttribute("State", state ?? ""),
                                    new XAttribute("Type", sortCriterion.Type ?? "")
                                    ));
            })
                             ),
                new XElement("Layouts",
                             part.Layouts.Select(layout => {
                var descriptor = _projectionManager.GetFilter(layout.Category, layout.Type);

                var state = layout.State;
                if (descriptor != null)
                {
                    state = _formManager.Export(descriptor.Form, layout.State, context);
                }

                return(new XElement("Layout",
                                    // Attributes
                                    new XAttribute("Category", layout.Category ?? ""),
                                    new XAttribute("Description", layout.Description ?? ""),
                                    new XAttribute("State", state ?? ""),
                                    new XAttribute("Display", layout.Display),
                                    new XAttribute("DisplayType", layout.DisplayType ?? ""),
                                    new XAttribute("Type", layout.Type ?? ""),

                                    // Properties
                                    new XElement("Properties", layout.Properties.Select(GetPropertyXml)),

                                    // Group
                                    new XElement("Group", GetPropertyXml(layout.GroupProperty))
                                    ));
            })
                             )
                );
        }