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