private static XElement ConstructComplexProperty(EdmProperty complexProperty, string columnNamePrefix, string csdlNamespace)
        {
            // don't add anything if the complex type associated with this property is empty.
            if (complexProperty == null ||
                complexProperty.TypeUsage == null ||
                !(complexProperty.TypeUsage.EdmType is ComplexType))
            {
                Debug.Fail("We should not have called ConstructComplexProperty on a property that is not a complex property");
                return(null);
            }

            var complexType = complexProperty.TypeUsage.EdmType as ComplexType;

            if (complexType != null)
            {
                if (complexType.Properties.Count == 0)
                {
                    return(null);
                }
            }

            var complexPropertyElement = new XElement(
                _msl + "ComplexProperty", new XAttribute("Name", complexProperty.Name),
                new XAttribute("TypeName", csdlNamespace + "." + complexProperty.TypeUsage.EdmType.Name));

            complexProperty.VisitComplexProperty(
                (namePrefix, nestedProperty) =>
            {
                if (nestedProperty.IsComplexProperty())
                {
                    complexPropertyElement.Add(
                        ConstructComplexProperty(nestedProperty, columnNamePrefix + "_" + nestedProperty.Name, csdlNamespace));
                }
                else
                {
                    complexPropertyElement.Add(
                        new XElement(
                            _msl + "ScalarProperty", new XAttribute("Name", nestedProperty.Name),
                            new XAttribute("ColumnName", columnNamePrefix + "_" + nestedProperty.Name)));
                }
            }, "_", false);

            if (complexPropertyElement.Nodes().Any())
            {
                return(complexPropertyElement);
            }
            return(null);
        }