private IEnumerable <PropertyData> CreateProperties(ResourceClassBase resourceClass) { var allPossibleProperties = resourceClass.FilterContext.UnfilteredResourceClass?.NonIdentifyingProperties ?? resourceClass.NonIdentifyingProperties; var currentProperties = resourceClass.AllProperties; var propertyPairs = (from p in allPossibleProperties join c in currentProperties on p.PropertyName equals c.PropertyName into leftJoin from _c in leftJoin.DefaultIfEmpty() where // Non-identifying properties only !p.IsIdentifying // Exclude boilerplate "id" property && !p.PropertyName.Equals("Id") // Exclude inherited properties && !p.IsInheritedProperty() orderby p.PropertyName select new { UnderlyingProperty = p, CurrentProperty = _c }) .ToList(); foreach (var propertyPair in propertyPairs) { // If the property was filtered out, then generate an explicit interface "Null" implementation only. if (propertyPair.CurrentProperty == null) { yield return(PropertyData.CreateNullProperty(propertyPair.UnderlyingProperty)); continue; } var property = propertyPair.CurrentProperty; if (property.IsSynchronizable()) { if (resourceClass.IsDescriptorEntity()) { if (!property.IsInheritedProperty()) { yield return(AssembleDerivedProperty(property)); } } else if (property.IsDirectLookup) { yield return(PropertyData.CreateStandardProperty(property)); } else { yield return (property.HasAssociations() ? PropertyData.CreateReferencedProperty(property) : PropertyData.CreateStandardProperty(property)); } } else { if (property.HasAssociations()) { yield return(property.IsLookup ? PropertyData.CreateStandardProperty(property) : PropertyData.CreateReferencedProperty(property)); } else { yield return(PropertyData.CreateStandardProperty(property)); } } } }
public object AssembleInheritedProperties( ResourceProfileData profileData, ResourceClassBase resource) { if (profileData == null) { throw new ArgumentNullException(nameof(profileData)); } if (resource == null) { throw new ArgumentNullException(nameof(resource)); } IList <ResourcePropertyData> includedProperties = null; if (profileData.HasProfile) { includedProperties = (resource.Name == profileData.SuppliedResource.Name ? profileData.UnfilteredResource : resource).InheritedProperties() .Where(x => !x.IsIdentifying && !x.PropertyName.Equals("Id")) .OrderBy(x => x.PropertyName) .Select( x => new ResourcePropertyData { Property = x, IsStandardProperty = !profileData.IsIncluded(resource, x) }) .ToList(); } else { includedProperties = resource.InheritedProperties() .OrderBy(x => x.PropertyName) .Where(x => !x.IsIdentifying && !x.PropertyName.Equals("Id")) .Select( x => new ResourcePropertyData { Property = x, IsStandardProperty = false }) .ToList(); } var propertiesToRender = new List <PropertyData>(); if (resource.IsDescriptorEntity() && resource.InheritedProperties() .Any(x => !x.IsIdentifying && !x.PropertyName.Equals("Id"))) { propertiesToRender.AddRange( includedProperties.Select( x => { var propertyData = x.IsStandardProperty ? PropertyData.CreateNullProperty(x.Property) : PropertyData.CreateStandardProperty(x.Property); propertyData[ResourceRenderer.MiscellaneousComment] = "// NOT in a reference, NOT a lookup column "; return(propertyData); })); } else if (resource.IsDerived) { propertiesToRender.AddRange( includedProperties.Select( x => x.IsStandardProperty ? PropertyData.CreateNullProperty(x.Property) : PropertyData.CreateStandardProperty(x.Property))); } return(propertiesToRender.Any() ? new { Properties = CreatePropertyDtos(propertiesToRender) } : ResourceRenderer.DoNotRenderProperty); }