public Entity(System.Dynamic.ExpandoObject expandoObject) { var formattedAttributePostFix = "@OData.Community.Display.V1.FormattedValue"; var attributes = expandoObject.ToArray(); for (var i = 0; i < attributes.Length; i++ ) { var keyValuePair = attributes[i]; var value = keyValuePair.Value; var valueFieldName = keyValuePair.Key; Type convertValueToType = null; if (value != null) { if (value is string stringValue && Guid.TryParse(stringValue, out var id)) { value = id; var propertyWithEntityRefAttribute = GetPublicInstanceProperties().FirstOrDefault(x => x.GetCustomAttribute <EntityReferenceAttribute>()?.ValueField?.Equals(valueFieldName, StringComparison.CurrentCultureIgnoreCase) == true); if (propertyWithEntityRefAttribute != null) { var entityReferenceAttribute = propertyWithEntityRefAttribute.GetCustomAttribute <EntityReferenceAttribute>(); propertyWithEntityRefAttribute.SetValue(this, new EntityReference(entityReferenceAttribute.EntitySetName, id)); } } else { if (value is ExpandoObject valueExpandoObject) { var propertyWithEntityAttribute = GetPublicInstanceProperties().FirstOrDefault(x => x.GetCustomAttribute <EntityAttribute>()?.AttributeName?.Equals(valueFieldName, StringComparison.CurrentCultureIgnoreCase) == true); if (propertyWithEntityAttribute != null) { value = Activator.CreateInstance(propertyWithEntityAttribute.PropertyType, valueExpandoObject); } } else { var propertyForField = GetPublicInstanceProperties().FirstOrDefault(x => x.Name.Equals(valueFieldName, StringComparison.CurrentCultureIgnoreCase) == true); if (propertyForField != null) { convertValueToType = propertyForField.PropertyType; } } } if (convertValueToType != null) { if (convertValueToType.IsGenericType && convertValueToType.GetGenericTypeDefinition() == typeof(Nullable <>)) { convertValueToType = Nullable.GetUnderlyingType(convertValueToType); } value = Convert.ChangeType(value, convertValueToType); } if (valueFieldName.EndsWith(formattedAttributePostFix)) { FormattedValues.Add(valueFieldName.Replace(formattedAttributePostFix, string.Empty), value?.ToString()); } else { Attributes.Add(valueFieldName, value); } } }