annotate Extensions/JointureAddOn/Mapping/FullMappingSchema.cs @ 9:1e85f66cf767 default tip

update bltoolkit
author nickolay
date Thu, 05 Apr 2018 20:53:26 +0300
parents f990fcb411a9
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1 #region
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3 using System;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4 using System.Collections;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
5 using System.Collections.Generic;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
6 using System.Data;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
7 using System.Linq;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
8 using BLToolkit.Data;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
9 using BLToolkit.Reflection.Extension;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
10
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
11 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
12
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
13 namespace BLToolkit.Mapping
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
14 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
15 public class FullMappingSchema : MappingSchema
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
16 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
17 #region Fields
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
18
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
19 private readonly DbManager _db;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
20 private readonly bool _ignoreLazyLoad;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
21 private DataTable _schema;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
22 private List<string> _schemaColumns;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
23 private readonly MappingSchema _parentMappingSchema;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
24 private readonly FactoryType _factoryType;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
25
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
26 private ExtensionList _extensions;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
27
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
28 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
29
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
30 public FullMappingSchema(DbManager db, bool ignoreLazyLoad = false, MappingSchema parentMappingSchema = null,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
31 FactoryType factoryType = FactoryType.LazyLoading)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
32 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
33 _db = db;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
34 _parentMappingSchema = parentMappingSchema;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
35 _factoryType = factoryType;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
36 _ignoreLazyLoad = ignoreLazyLoad;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
37 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
38
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
39 #region Overrides
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
40
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
41 public override ExtensionList Extensions
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
42 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
43 get
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
44 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
45 if (_parentMappingSchema != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
46 return this._parentMappingSchema.Extensions;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
47 return _extensions;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
48 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
49 set
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
50 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
51 if (_parentMappingSchema != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
52 this._parentMappingSchema.Extensions = value;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
53 _extensions = value;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
54 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
55 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
56
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
57 protected override ObjectMapper CreateObjectMapperInstance(Type type)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
58 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
59 return new FullObjectMapper(_db, _ignoreLazyLoad,_factoryType);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
60 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
61
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
62 protected override void MapInternal(Reflection.InitContext initContext, IMapDataSource source, object sourceObject, IMapDataDestination dest, object destObject, params object[] parameters)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
63 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
64 FullObjectMapper mapper = (FullObjectMapper)initContext.ObjectMapper;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
65 IDataReader dataReader = (IDataReader)sourceObject;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
66
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
67 //int[] index = GetIndex(source, dest);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
68 //IValueMapper[] mappers = GetValueMappers(source, dest, index);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
69
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
70 //foreach (var valueMapper in mappers)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
71 //{
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
72
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
73 //}
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
74
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
75 InitSchema(dataReader);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
76
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
77 if (mapper.ColParent)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
78 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
79 FillObject(mapper, dataReader, destObject);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
80 while (dataReader.Read())
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
81 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
82 destObject = FillObject(destObject, mapper, dataReader);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
83 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
84 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
85 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
86 FillObject(mapper, dataReader, destObject);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
87 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
88
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
89 public override IList MapDataReaderToList(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
90 IDataReader reader,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
91 IList list,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
92 Type destObjectType,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
93 params object[] parameters)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
94 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
95 return internalMapDataReaderToList(reader, list, destObjectType, parameters);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
96 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
97
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
98 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
99
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
100 #region Private methods
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
101
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
102 private object FillObject(object result, IObjectMapper mapper, IDataReader datareader)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
103 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
104 foreach (IMapper map in mapper.PropertiesMapping)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
105 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
106 if (map is IObjectMapper && (map as IObjectMapper).IsLazy)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
107 continue;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
108
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
109 if (map is CollectionFullObjectMapper)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
110 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
111 var collectionFullObjectMapper = (CollectionFullObjectMapper) map;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
112 object listInstance = collectionFullObjectMapper.Getter(result);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
113 if (listInstance == null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
114 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
115 listInstance = Activator.CreateInstance((map as CollectionFullObjectMapper).PropertyCollectionType);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
116 map.Setter(result, listInstance);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
117 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
118 var list = (IList) listInstance;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
119 object fillObject = ((CollectionFullObjectMapper)map).CreateInstance();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
120 FillObject((CollectionFullObjectMapper) map, datareader, fillObject);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
121
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
122 if (list.Count > 0)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
123 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
124 var curMapper = (FullObjectMapper)GetObjectMapper(fillObject.GetType());
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
125
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
126 object lastElement = list[list.Count - 1];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
127
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
128 bool allPksEqual = true;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
129
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
130 //This is needed, because DBValue can be Null, but the Field can be Guid, wich then is filled with Guid.Empty and this is also a valid value!
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
131 /*foreach (var pkIndex in pkIndexes)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
132 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
133 var dbValue = reader.GetValue(pkIndex);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
134 if (dbValue == DBNull.Value)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
135 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
136 pkIsNull = true;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
137 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
138 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
139 }*/
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
140
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
141 foreach (var pkGetter in curMapper.PrimaryKeyValueGetters)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
142 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
143 object lastPk = pkGetter.Invoke(lastElement);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
144 object currentPk = pkGetter.Invoke(fillObject);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
145
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
146 if (!lastPk.Equals(currentPk))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
147 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
148 allPksEqual = false;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
149 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
150 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
151 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
152
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
153 if (allPksEqual)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
154 continue;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
155 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
156
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
157 ((IList) listInstance).Add(fillObject);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
158 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
159 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
160
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
161 return result;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
162 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
163
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
164 private void FillObject(IObjectMapper mapper, IDataReader datareader, object result)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
165 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
166 foreach (IMapper map in mapper.PropertiesMapping)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
167 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
168 if (map is IObjectMapper && (map as IObjectMapper).IsLazy)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
169 continue;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
170
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
171 if (map is ValueMapper)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
172 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
173 if (((ValueMapper)map).SetDataReaderIndex(_schemaColumns))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
174 continue;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
175 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
176
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
177 if (datareader.IsDBNull(map.DataReaderIndex))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
178 continue;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
179
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
180 if (map is ValueMapper)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
181 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
182 object value = datareader.GetValue(map.DataReaderIndex);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
183
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
184 try
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
185 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
186 map.Setter(result, value);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
187 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
188 catch (Exception exception)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
189 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
190 throw new Exception(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
191 string.Format("FillOject failed for field : {0} of class: {1}.\nColumn name : {2} Db type is: {3} and value : {4}",
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
192 map.PropertyName, mapper.PropertyType,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
193 ((ValueMapper) map).ColumnName,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
194 value == null ? "Null" : value.GetType().ToString(), value), exception);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
195 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
196 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
197
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
198 if (map is FullObjectMapper)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
199 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
200 object fillObject = ((FullObjectMapper) map).CreateInstance();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
201 FillObject((FullObjectMapper) map, datareader, fillObject);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
202 map.Setter(result, fillObject);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
203 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
204
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
205 if (map is CollectionFullObjectMapper)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
206 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
207 var collectionFullObjectMapper = (CollectionFullObjectMapper) map;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
208
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
209 object listInstance = collectionFullObjectMapper.Getter(result);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
210 if (listInstance == null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
211 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
212 listInstance = Activator.CreateInstance((map as CollectionFullObjectMapper).PropertyCollectionType);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
213 map.Setter(result, listInstance);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
214 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
215
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
216 object fillObject = ((CollectionFullObjectMapper)map).CreateInstance();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
217 FillObject((CollectionFullObjectMapper) map, datareader, fillObject);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
218 ((IList) listInstance).Add(fillObject);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
219 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
220 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
221 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
222
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
223 private void InitSchema(IDataReader reader)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
224 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
225 _schemaColumns = new List<string>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
226 _schema = reader.GetSchemaTable();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
227 if (_schema != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
228 _schema.Rows.Cast<DataRow>().ToList().ForEach(dr => _schemaColumns.Add((string)dr["ColumnName"]));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
229 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
230
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
231 private IList internalMapDataReaderToList(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
232 IDataReader reader,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
233 IList list,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
234 Type destObjectType,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
235 params object[] parameters)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
236 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
237 FullObjectMapper mapper = (FullObjectMapper)GetObjectMapper(destObjectType);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
238
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
239 InitSchema(reader);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
240
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
241 object currentItem = null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
242
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
243 List<int> pkIndexes = new List<int>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
244 foreach (var nm in mapper.PrimaryKeyNames)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
245 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
246 pkIndexes.Add(mapper.PropertiesMapping.First(x => x.PropertyName == nm).DataReaderIndex);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
247 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
248
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
249 while (reader.Read())
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
250 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
251 var result = mapper.CreateInstance();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
252
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
253 FillObject(mapper, reader, result);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
254 if (currentItem == null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
255 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
256 currentItem = result;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
257 list.Add(result);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
258 continue;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
259 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
260
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
261 bool pkIsNull = false;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
262 bool allPksEqual = true;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
263
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
264 //This is needed, because DBValue can be Null, but the Field can be Guid, wich then is filled with Guid.Empty and this is also a valid value!
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
265 foreach (var pkIndex in pkIndexes)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
266 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
267 var dbValue = reader.GetValue(pkIndex);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
268 if (dbValue == DBNull.Value)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
269 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
270 pkIsNull = true;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
271 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
272 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
273 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
274
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
275 if (!pkIsNull)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
276 foreach (var pkGetter in mapper.PrimaryKeyValueGetters)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
277 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
278 object resultPk = pkGetter.Invoke(result);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
279 object currentItemPk = pkGetter.Invoke(currentItem);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
280
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
281 if (!resultPk.Equals(currentItemPk))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
282 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
283 allPksEqual = false;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
284 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
285 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
286 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
287
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
288 if (!pkIsNull && !allPksEqual)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
289 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
290 currentItem = result;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
291 list.Add(result);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
292 //continue;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
293 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
294
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
295 if (mapper.ColParent)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
296 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
297 FillObject(currentItem, mapper, reader);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
298 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
299 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
300
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
301 return list;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
302 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
303
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
304 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
305 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
306 }