Exemplo n.º 1
0
        public StaticMappingDescription Build(StaticMappingConfiguration configuration, params object[] items)
        {
            if (items == null)
            {
                return(null);
            }

            var combinedResult = new StaticMappingDescription();

            foreach (var dbContext in items)
            {
                var buildResult = BuildInternal(configuration, dbContext);

                if (buildResult == null)
                {
                    continue;
                }

                foreach (var kv in buildResult)
                {
                    combinedResult[kv.Key] = kv.Value;
                }
            }

            return(combinedResult);
        }
Exemplo n.º 2
0
        private static bool TryMapStatic(StaticMappingDescription staticMappings
                                         , Type targetType, string requestedProperty, out string classPropertyName, out Type newType)
        {
            classPropertyName = null;
            newType           = targetType;

            if (staticMappings == null || staticMappings.Count == 0)
            {
                return(false);
            }

            var targetTypeStr = targetType.FullName.ToLowerInvariant();

            if (!staticMappings.TryGetValue(targetTypeStr, out var propertyDescriptions))
            {
                return(false);
            }

            if (!propertyDescriptions.TryGetValue(requestedProperty, out var propertyDescription))
            {
                return(false);
            }

            classPropertyName = propertyDescription.ClassPropertyName;
            newType           = propertyDescription.Type;

            return(true);
        }
Exemplo n.º 3
0
 public AutoQueryHandler(IQueryStringAccessor queryStringAccessor, ICriteriaFilterManager criteriaFilterManager, IClauseMapManager clauseMapManager, IClauseValueManager clauseValueManager, IAutoQueryableProfile profile,
                         StaticMappingDescription staticMappingDescription = null)
 {
     _queryStringAccessor   = queryStringAccessor;
     _criteriaFilterManager = criteriaFilterManager;
     _clauseMapManager      = clauseMapManager;
     _clauseValueManager    = clauseValueManager;
     _profile = profile;
     _staticMappingDescription = staticMappingDescription;
 }
Exemplo n.º 4
0
        private static StaticMappingDescription BuildInternal(StaticMappingConfiguration configuration,
                                                              object dbContext)
        {
            var result = new StaticMappingDescription();

            var modelData = dbContext.GetType().GetProperty("Model")?.GetValue(dbContext);

            if (modelData == null)
            {
                return(result);
            }

            var entityTypes = (IDictionary)modelData.GetType()
                              .GetField("_entityTypes", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public)?
                              .GetValue(modelData);

            if (entityTypes == null)
            {
                return(result);
            }

            foreach (DictionaryEntry kv in entityTypes)
            {
                var normalizedTypeName = kv.Key.ToString().ToLowerInvariant();
                var typePropDict       = new Dictionary <string, PropertyDescription>();

                result[normalizedTypeName] = typePropDict;

                var props = kv.Value.GetType().GetField("_properties",
                                                        BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public)?
                            .GetValue(kv.Value) as IDictionary;

                if (props == null)
                {
                    continue;
                }


                string ToSnakeCase(string input)
                {
                    return(string
                           .Concat(input.Select((x, i) => i > 0 && char.IsUpper(x) ? "_" + x.ToString() : x.ToString()))
                           .ToLower());
                }

                void AddMap(string fieldName, PropertyInfo classPropInfo)
                {
                    typePropDict[fieldName] = new PropertyDescription
                    {
                        ClassPropertyName = classPropInfo.Name,
                        IsEnumerable      = classPropInfo.PropertyType.IsEnumerable(),
                        Type = classPropInfo.PropertyType
                    };
                }

                var navigators = kv.Value.GetType().GetField("_navigations",
                                                             BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public)?
                                 .GetValue(kv.Value) as IDictionary;

                if (navigators != null && navigators.Count > 0)
                {
                    foreach (DictionaryEntry nav in navigators)
                    {
                        AddMap(configuration.UseSnakeCaseForNavigationProperties ? ToSnakeCase(nav.Key.ToString()) : nav.Key.ToString(),
                               (PropertyInfo)nav.Value.GetType().GetProperty("PropertyInfo").GetValue(nav.Value));
                    }
                }

                foreach (DictionaryEntry prop in props)
                {
                    var resultPropName = prop.Key.ToString();
                    var propInfo       = (PropertyInfo)prop.Value.GetType().GetProperty("PropertyInfo").GetValue(prop.Value);

                    var getAnnotationsMethodRef = prop.Value.GetType()
                                                  .GetMethod("GetAnnotations",
                                                             BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public);

                    if (getAnnotationsMethodRef == null)
                    {
                        AddMap(resultPropName, propInfo);
                        continue;
                    }

                    var annotationsMethodResult = getAnnotationsMethodRef.Invoke(prop.Value, null) as IEnumerable;

                    if (annotationsMethodResult == null)
                    {
                        AddMap(resultPropName, propInfo);
                        continue;
                    }

                    foreach (var anotation in annotationsMethodResult)
                    {
                        var name = anotation.GetType().GetProperty("Name").GetValue(anotation)?.ToString();

                        if (name == "Relational:ColumnName")
                        {
                            resultPropName = anotation.GetType().GetProperty("Value").GetValue(anotation).ToString();
                        }

                        AddMap(resultPropName, propInfo);
                    }
                }
            }

            return(result);
        }