Пример #1
0
        private static List <PocoMember> CreateDynamicDictionaryPocoMembers(IEnumerable <GroupResult <PosName> > subItems, PocoData pocoData, Type type)
        {
            var isDict   = type != typeof(object);
            var dataType = isDict ? type.GetGenericArguments().Last() : type;

            return(subItems.Select(x =>
            {
                var member = new DynamicPocoMember
                {
                    MemberInfoData = new MemberInfoData(x.Item, dataType, type),
                    PocoColumn = new ExpandoColumn
                    {
                        ColumnName = x.Item
                    }
                };

                if (isDict)
                {
                    var pocoDataBuilder = new PocoDataBuilder(dataType, pocoData.Mapper);
                    member.PocoMemberChildren = pocoDataBuilder.GetPocoMembers(pocoDataBuilder.GetColumnInfos(dataType), new List <MemberInfo>()).Select(plan => plan(pocoData.TableInfo)).ToList();
                    member.SetDynamicMemberAccessor(new FastCreate(dataType, pocoData.Mapper));
                }

                return (PocoMember)member;
            }).ToList());
        }
        public static IEnumerable <PosName> ConvertFromNewConvention(this IEnumerable <PosName> posNames, PocoData pocoData)
        {
            IEnumerable <PocoMember> allMembers        = pocoData.GetAllMembers();
            List <PocoMember>        scopedPocoMembers = pocoData.Members;
            string prefix = null;

            foreach (PosName posName in posNames)
            {
                if (posName.Name.StartsWith(SplitPrefix, StringComparison.OrdinalIgnoreCase))
                {
                    prefix = posName.Name.Substring(SplitPrefix.Length);
                    PocoMember relevantMembers = allMembers.SingleOrDefault(x => string.Equals(PocoColumn.GenerateKey(x.MemberInfoChain), prefix, StringComparison.OrdinalIgnoreCase));
                    if (relevantMembers != null)
                    {
                        scopedPocoMembers = relevantMembers.PocoMemberChildren;
                    }

                    continue;
                }

                PocoMember member = FindMember(scopedPocoMembers, posName.Name);
                if (member != null && member.PocoColumn != null)
                {
                    posName.Name = member.PocoColumn.MemberInfoKey;
                }
                else
                {
                    posName.Name = PocoDataBuilder.JoinStrings(prefix, posName.Name);
                }

                yield return(posName);
            }
        }
Пример #3
0
        private IEnumerable <MapPlan> BuildMapPlans(GroupResult <PosName> groupedName, DbDataReader dataReader, PocoData pocoData, List <PocoMember> pocoMembers)
        {
            // find pocomember by property name
            var pocoMember = pocoMembers.FirstOrDefault(x => IsEqual(groupedName.Item, x.Name, x.PocoColumn?.ExactColumnNameMatch ?? false) ||
                                                        string.Equals(groupedName.Item, x.PocoColumn?.ColumnAlias, StringComparison.OrdinalIgnoreCase));

            if (pocoMember == null)
            {
                yield break;
            }

            if (groupedName.SubItems.Any())
            {
                var memberInfoType = pocoMember.MemberInfoData.MemberType;
                if (memberInfoType.IsAClass() || pocoMember.IsDynamic)
                {
                    var children = PocoDataBuilder.IsDictionaryType(memberInfoType)
                        ? CreateDynamicDictionaryPocoMembers(groupedName.SubItems, pocoData, memberInfoType)
                        : pocoMember.PocoMemberChildren;

                    var subPlans = groupedName.SubItems.SelectMany(x => BuildMapPlans(x, dataReader, pocoData, children)).ToArray();

                    yield return((reader, values, instance) =>
                    {
                        var newObject = pocoMember.IsList ? pocoMember.Create(dataReader) : (pocoMember.GetValue(instance) ?? pocoMember.Create(dataReader));

                        var shouldSetNestedObject = false;
                        foreach (var subPlan in subPlans)
                        {
                            shouldSetNestedObject |= subPlan(reader, values, newObject);
                        }

                        if (shouldSetNestedObject)
                        {
                            if (pocoMember.IsList)
                            {
                                var list = pocoMember.CreateList();
                                list.Add(newObject);
                                newObject = list;
                            }

                            pocoMember.SetValue(instance, newObject);
                            return true;
                        }
                        return false;
                    });
                }
            }
            else
            {
                var destType     = pocoMember.MemberInfoData.MemberType;
                var defaultValue = MappingHelper.GetDefault(destType);
                var converter    = GetConverter(pocoData, pocoMember.PocoColumn, dataReader.GetFieldType(groupedName.Key.Pos), destType);
                yield return((reader, values, instance) => MapValue(groupedName, values, converter, instance, pocoMember.PocoColumn, defaultValue));
            }
        }
Пример #4
0
        private IEnumerable <MapPlan> BuildMapPlans(GroupResult <PosName> groupedName, DbDataReader dataReader, PocoData pocoData, List <PocoMember> pocoMembers)
        {
            // find pocomember by property name
            PocoMember pocoMember = pocoMembers.FirstOrDefault(x => IsEqual(groupedName.Item, x.Name));

            if (pocoMember == null)
            {
                yield break;
            }

            if (groupedName.SubItems.Any())
            {
                Type memberInfoType = pocoMember.MemberInfoData.MemberType;
                if (memberInfoType.IsAClass() || pocoMember.IsDynamic)
                {
                    List <PocoMember> children = PocoDataBuilder.IsDictionaryType(memberInfoType)
                        ? CreateDynamicDictionaryPocoMembers(groupedName.SubItems, pocoData)
                        : pocoMember.PocoMemberChildren;

                    MapPlan[] subPlans = groupedName.SubItems.SelectMany(x => this.BuildMapPlans(x, dataReader, pocoData, children)).ToArray();

                    yield return((reader, instance) =>
                    {
                        object newObject = pocoMember.IsList ? pocoMember.Create(dataReader) : (pocoMember.GetValue(instance) ?? pocoMember.Create(dataReader));

                        bool shouldSetNestedObject = false;
                        foreach (MapPlan subPlan in subPlans)
                        {
                            shouldSetNestedObject |= subPlan(reader, newObject);
                        }

                        if (shouldSetNestedObject)
                        {
                            if (pocoMember.IsList)
                            {
                                IList list = pocoMember.CreateList();
                                list.Add(newObject);
                                newObject = list;
                            }

                            pocoMember.SetValue(instance, newObject);
                            return true;
                        }
                        return false;
                    });
                }
            }
            else
            {
                Type   destType                 = pocoMember.MemberInfoData.MemberType;
                object defaultValue             = MappingHelper.GetDefault(destType);
                Func <object, object> converter = GetConverter(pocoData, pocoMember.PocoColumn, dataReader.GetFieldType(groupedName.Key.Pos), destType);
                yield return((reader, instance) => this.MapValue(groupedName, reader, converter, instance, pocoMember.PocoColumn, defaultValue));
            }
        }
Пример #5
0
        private static bool IsPocoMemberEqual(PocoMember pocoMember, string prefix, string name)
        {
            if (pocoMember.PocoColumn == null)
            {
                return(PropertyMapper.IsEqual(name, pocoMember.Name, false));
            }

            if (pocoMember.PocoColumn.MemberInfoKey == name)
            {
                return(true);
            }

            if (string.Equals(pocoMember.PocoColumn.ColumnName, PocoDataBuilder.JoinStrings(prefix, name), StringComparison.OrdinalIgnoreCase))
            {
                return(true);
            }

            if (PropertyMapper.IsEqual(name, pocoMember.PocoColumn.ColumnAlias ?? pocoMember.PocoColumn.ColumnName, pocoMember.PocoColumn.ExactColumnNameMatch))
            {
                return(true);
            }

            return(PropertyMapper.IsEqual(name, pocoMember.Name, pocoMember.PocoColumn.ExactColumnNameMatch));
        }
        private static IEnumerable <ColumnDefinition> GetColumnDefinitions(ConventionScannerSettings scannerSettings, Type type, List <MemberInfo> memberInfos, bool isReferenceProperty = false)
        {
            MemberInfo[] capturedMembers = memberInfos.ToArray();
            foreach (MemberInfo member in ReflectionUtils.GetFieldsAndPropertiesForClasses(type))
            {
                bool complexProperty   = scannerSettings.ComplexPropertiesWhere(member);
                bool referenceProperty = scannerSettings.ReferencePropertiesWhere(member);
                bool dbColumn          = scannerSettings.DbColumnWhere(member);

                if ((complexProperty || referenceProperty) && !dbColumn)
                {
                    if (capturedMembers.GroupBy(x => x.GetMemberInfoType()).Any(x => x.Count() >= 2))
                    {
                        continue;
                    }

                    List <MemberInfo> members = new List <MemberInfo>();
                    members.AddRange(capturedMembers);
                    members.Add(member);

                    Type memberInfoType = member.GetMemberInfoType();
                    if (PocoDataBuilder.IsList(member))
                    {
                        memberInfoType = memberInfoType.GetGenericArguments().First();
                    }

                    List <ColumnDefinition> columnDefinitions = GetColumnDefinitions(scannerSettings, memberInfoType, members, referenceProperty).ToList();

                    foreach (ColumnDefinition columnDefinition in columnDefinitions)
                    {
                        yield return(columnDefinition);
                    }

                    string referenceDbColumnsNamed = scannerSettings.ReferenceDbColumnsNamed(member);

                    yield return(new ColumnDefinition()
                    {
                        MemberInfoChain = capturedMembers.Concat(new[] { member }).ToArray(),
                        MemberInfo = member,
                        IsComplexMapping = complexProperty,
                        IsReferenceMember = referenceProperty,
                        ReferenceType = ReferenceType.None,
                        ReferenceMember = null,
                        DbColumnName = referenceProperty ? referenceDbColumnsNamed : null,
                    });
                }
                else
                {
                    ColumnDefinition columnDefinition = new ColumnDefinition();
                    columnDefinition.MemberInfoChain = capturedMembers.Concat(new[] { member }).ToArray();
                    columnDefinition.MemberInfo      = member;

                    IEnumerable <string> prefixProperty = isReferenceProperty ? Enumerable.Empty <string>() : capturedMembers.Select(x => scannerSettings.DbColumnsNamed(x));
                    columnDefinition.DbColumnName = string.Join(PocoData.Separator, prefixProperty.Concat(new[] { scannerSettings.DbColumnsNamed(member) }).ToArray());

                    columnDefinition.DbColumnAlias      = scannerSettings.AliasNamed(member);
                    columnDefinition.IgnoreColumn       = scannerSettings.IgnorePropertiesWhere.Any(x => x.Invoke(member));
                    columnDefinition.DbColumnType       = scannerSettings.DbColumnTypesAs(member);
                    columnDefinition.ResultColumn       = scannerSettings.ResultPropertiesWhere(member);
                    columnDefinition.ComputedColumn     = scannerSettings.ComputedPropertiesWhere(member);
                    columnDefinition.ComputedColumnType = scannerSettings.ComputedPropertyTypeAs(member);
                    columnDefinition.VersionColumn      = scannerSettings.VersionPropertiesWhere(member);
                    columnDefinition.VersionColumnType  = scannerSettings.VersionPropertyTypeAs(member);
                    columnDefinition.ForceUtc           = scannerSettings.ForceDateTimesToUtcWhere(member);
                    columnDefinition.Serialized         = scannerSettings.SerializedWhere(member);
                    yield return(columnDefinition);
                }
            }
        }