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);
            }
        }
Пример #2
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));
            }
        }
Пример #3
0
        private static bool IsPocoMemberEqual(PocoMember pocoMember, string name)
        {
            if (pocoMember.PocoColumn == null)
            {
                return(PropertyMapper.IsEqual(name, pocoMember.Name, false));
            }

            if (pocoMember.PocoColumn.MemberInfoKey == name)
            {
                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));
        }
Пример #4
0
        public Dictionary <string, JoinData> GetJoinExpressions(Expression expression, string tableAlias, JoinType joinType)
        {
            IEnumerable <MemberInfo>      memberInfos     = MemberChainHelper.GetMembers(expression);
            List <PocoMember>             members         = this._pocoData.Members;
            Dictionary <string, JoinData> joinExpressions = new Dictionary <string, JoinData>();

            foreach (MemberInfo memberInfo in memberInfos)
            {
                PocoMember pocoMember = members
                                        .Where(x => x.ReferenceType != ReferenceType.None)
                                        .Single(x => x.MemberInfoData.MemberInfo == memberInfo);

                PocoColumn pocoColumn1 = pocoMember.PocoColumn;
                PocoMember pocoMember2 = pocoMember.PocoMemberChildren.Single(x => x.Name == pocoMember.ReferenceMemberName);
                PocoColumn pocoColumn2 = pocoMember2.PocoColumn;

                pocoColumn2.TableInfo.AutoAlias = tableAlias ?? pocoColumn2.TableInfo.AutoAlias;

                string onSql = this._database.DatabaseType.EscapeTableName(pocoColumn1.TableInfo.AutoAlias)
                               + "." + this._database.DatabaseType.EscapeSqlIdentifier(pocoColumn1.ColumnName)
                               + " = " + this._database.DatabaseType.EscapeTableName(pocoColumn2.TableInfo.AutoAlias)
                               + "." + this._database.DatabaseType.EscapeSqlIdentifier(pocoColumn2.ColumnName);

                if (!joinExpressions.ContainsKey(onSql))
                {
                    joinExpressions.Add(onSql, new JoinData()
                    {
                        OnSql          = onSql,
                        PocoMember     = pocoMember,
                        PocoMemberJoin = pocoMember2,
                        PocoMembers    = pocoMember.PocoMemberChildren,
                        JoinType       = joinType
                    });
                }

                members = pocoMember.PocoMemberChildren;
            }

            return(joinExpressions);
        }
Пример #5
0
        private static string BuildJoinSql(IDatabase database, List <JoinData> joinSqlExpressions, ref List <StringPocoCol> cols)
        {
            List <string> joins = new List <string>();

            foreach (JoinData joinSqlExpression in joinSqlExpressions)
            {
                PocoMember member = joinSqlExpression.PocoMemberJoin;

                cols = cols.Concat(joinSqlExpression.PocoMembers
                                   .Where(x => x.ReferenceType == ReferenceType.None)
                                   .Where(x => x.PocoColumn != null)
                                   .Select(x => new StringPocoCol
                {
                    StringCol = database.DatabaseType.EscapeTableName(x.PocoColumn.TableInfo.AutoAlias)
                                + "." + database.DatabaseType.EscapeSqlIdentifier(x.PocoColumn.ColumnName) + " as " + database.DatabaseType.EscapeSqlIdentifier(x.PocoColumn.MemberInfoKey),
                    PocoColumn = new[] { x.PocoColumn }
                })).ToList();

                joins.Add(string.Format("  {0} JOIN " + database.DatabaseType.EscapeTableName(member.PocoColumn.TableInfo.TableName) + " " + database.DatabaseType.EscapeTableName(member.PocoColumn.TableInfo.AutoAlias) + " ON " + joinSqlExpression.OnSql, joinSqlExpression.JoinType == JoinType.Inner ? "INNER" : "LEFT"));
            }

            return(joins.Any() ? " \n" + string.Join(" \n", joins.ToArray()) : string.Empty);
        }
        public static IEnumerable <PosName> ConvertFromOldConvention(this IEnumerable <PosName> posNames, List <PocoMember> pocoMembers)
        {
            Dictionary <PocoMember, int> used    = new Dictionary <PocoMember, int>();
            List <PocoMemberLevel>       members = FlattenPocoMembers(pocoMembers, new LevelMonitor()).ToList();
            int level = 0;

            foreach (PosName posName in posNames)
            {
                List <PocoMember> unusedPocoMembers = members.Where(x => !used.ContainsKey(x.PocoMember) && x.Level >= level)
                                                      .Select(x => x.PocoMember)
                                                      .ToList();

                PocoMember member = FindMember(unusedPocoMembers, posName.Name);
                if (member != null && member.PocoColumn != null)
                {
                    level = members.Single(x => x.PocoMember == member).Level;
                    used.Add(member, level);
                    posName.Name = member.PocoColumn.MemberInfoKey;
                }

                yield return(posName);
            }
        }
Пример #7
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));
        }