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); } }
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)); } }
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)); }
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); }
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); } }
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)); }