/// <summary> /// Конструктор для вспомогательной колонки StormJoinedMasterKey, /// котороя необходима для проставления ссылок на мастера /// (не только те мастера, которые указаны в представлении) /// </summary> public ColumnInfo(string columnName, StorageStructForView.PropSource propSource) { ColumnName = columnName; _propSources = new List <StorageStructForView.PropSource> { propSource }; }
/// <summary> /// Этот метод переопределён, чтобы создать словарь соответствия длинных и коротких имён для псевдонимов. /// </summary> /// <param name="storageStruct"> /// The storage Struct. /// </param> /// <param name="addNotMainKeys"> /// The add Not Main Keys. /// </param> /// <param name="addMasterFieldsCustomizer"> /// The add Master Fields Customizer. /// </param> /// <param name="AddingAdvansedField"> /// The Adding Advansed Field. /// </param> /// <param name="AddingKeysCount"> /// The Adding Keys Count. /// </param> /// <param name="SelectTypesIds"> /// The Select Types Ids. /// </param> /// <returns> /// The <see cref="string"/>. /// </returns> public override string GenerateSQLSelectByStorageStruct( StorageStructForView storageStruct, bool addNotMainKeys, bool addMasterFieldsCustomizer, string AddingAdvansedField, int AddingKeysCount, bool SelectTypesIds) { StorageStructForView.PropSource source = storageStruct.sources; foreach (StorageStructForView.PropSource subSource in source.LinckedStorages) { for (int j = 0; j < subSource.storage.Length; j++) { string curAlias = subSource.Name + j; GenerateShortName(curAlias); } } for (int i = 0; i < storageStruct.props.Length; i++) { StorageStructForView.PropStorage prop = storageStruct.props[i]; if (prop.MultipleProp) { continue; } bool propStored = prop.Stored; if (propStored && (string.IsNullOrEmpty(prop.Expression) || this.IsExpressionContainAttrubuteCheckOnly(prop.Expression))) { if (prop.MastersTypesCount > 0) { string deniedAccessValue = string.Empty; bool isAccessDenied = SecurityManager.UseRightsOnAttribute && !SecurityManager.CheckAccessToAttribute( prop.Expression, out deniedAccessValue); for (int j = 0; j < prop.storage.Length; j++) { for (int k = 0; k < prop.MastersTypes[j].Length; k++) { string curName = isAccessDenied ? deniedAccessValue : prop.source.Name + j; GenerateShortName(curName); } } } else { for (int j = 0; j < prop.storage.Length; j++) { GenerateShortName(prop.source.Name + j); } } } } return(base.GenerateSQLSelectByStorageStruct(storageStruct, addNotMainKeys, addMasterFieldsCustomizer, AddingAdvansedField, AddingKeysCount, SelectTypesIds)); }
/// <summary> /// Возвращает все таблицы мастеров после соединения. /// </summary> /// <param name="propSource">Базовый источник данных в котором будут искаться мастера</param> /// <param name="mainTable">Таблица основного объекта данных.</param> /// <param name="result">Результат выполнения метода. Необходим для выполнения рекурсии.</param> /// <returns>Таблицы мастеров после соединения</returns> private void SetAllMasterTables(StorageStructForView.PropSource propSource, DataTable mainTable, Dictionary <StorageStructForView.PropSource, DataTable> result) { if (propSource.LinckedStorages == null || propSource.LinckedStorages.Length == 0) { return; } foreach (var source in propSource.LinckedStorages) { string currentTableName = source.storage[0].Storage; DataTable dt1 = mainTable ?? result[propSource]; DataTable dt2 = _dataSet.Tables[currentTableName]; // соединяем переданный источник с текущим DataTable resultTable = GetResultJoinTables(dt1, dt2, source.ObjectLink, source.storage[0].PrimaryKeyStorageName); result.Add(source, resultTable); SetAllMasterTables(source, null, result); } }
/// <summary> /// Добавляет в таблицу новые строки с заполненными данными для указанной структуры /// </summary> /// <param name="dt">Таблица, в которую добавляются строки.</param> /// <param name="storageStruct">Структура хранения на основе которой будут добавлять строки.</param> /// <param name="columnsInfo">Информация о колонках для определения, что и в какие колонки записывать.</param> /// <param name="structIndex"> /// Номер структуры. /// Необходим для того, чтобы достать настройки из информации о колонках. /// Если необходимо заполнить таблицу одним массивом данных и структура была одна, то необходимо передать 0. /// </param> private void FillDataTable(DataTable dt, StorageStructForView storageStruct, List <ColumnInfo> columnsInfo, int structIndex) { DataTable mainDataTable = _dataSet.Tables[storageStruct.sources.storage[0].Storage]; int startRowsIndex = dt.Rows.Count; // Добавляем столько строк, сколько их в таблице основного объекта данных for (int i = 0; i < mainDataTable.Rows.Count; i++) { dt.Rows.Add(dt.NewRow()); } // В этот список будут записаны мастеровые таблицы после соединения. var masterTables = new Dictionary <StorageStructForView.PropSource, DataTable>(); SetAllMasterTables(storageStruct.sources, mainDataTable, masterTables); // Далее заполняем таблицу по ячейкам. foreach (var columnInfo in columnsInfo) { StorageStructForView.PropStorage propStorage = columnInfo.PropStorages == null ? null : columnInfo.PropStorages[structIndex]; StorageStructForView.PropSource propSource = columnInfo.PropSources == null ? null : columnInfo.PropSources[structIndex]; // Если это свойство хранимое if (propStorage != null && propStorage.Stored && !columnInfo.IsStormDataObjectType && !columnInfo.IsStormJoinedMasterKey && !columnInfo.IsStormMainObjectKey) { // Если это свойство является собственным для основного объекта данных, то ищем в основной таблице. if (propSource == storageStruct.sources) { for (int i = 0; i < mainDataTable.Rows.Count; i++) { dt.Rows[i + startRowsIndex][columnInfo.ColumnName] = mainDataTable.Rows[i][propStorage.Name]; } } else if (masterTables.ContainsKey(propSource)) { // иначе это свойство мастера и надо брать его из таблицы мастеров после соединения for (int i = 0; i < mainDataTable.Rows.Count; i++) { dt.Rows[i + startRowsIndex][columnInfo.ColumnName] = masterTables[propSource].Rows[i][propStorage.simpleName]; } } } else { if (columnInfo.IsStormMainObjectKey) { // в эту колонку записываются первичные ключи основного объекта данных for (int i = 0; i < mainDataTable.Rows.Count; i++) { dt.Rows[i + startRowsIndex][columnInfo.ColumnName] = mainDataTable.Rows[i][storageStruct.sources.storage[0].PrimaryKeyStorageName]; } } else if (columnInfo.IsStormDataObjectType) { // В эту колонку записывается номер типа для загрузки данных. // Он необходим когда читаются наследники через базовый класс. for (int i = 0; i < mainDataTable.Rows.Count; i++) { dt.Rows[i + startRowsIndex][columnInfo.ColumnName] = structIndex; } } else if (columnInfo.IsStormJoinedMasterKey) { // если этот мастер был указан в представлении, то его можно вытянуть через PropStorage string simpleName = propStorage != null ? propStorage.simpleName : propSource.storage[0].PrimaryKeyStorageName; // в эти колонки записываются первичные ключи мастеров for (int i = 0; i < mainDataTable.Rows.Count; i++) { // Ключ мастера храниться в таблице мастера if (masterTables.ContainsKey(propSource)) { dt.Rows[i + startRowsIndex][columnInfo.ColumnName] = masterTables[propSource].Rows[i][simpleName]; } else { // или его можно взять сразу из таблицы основного объекта данных dt.Rows[i + startRowsIndex][columnInfo.ColumnName] = mainDataTable.Rows[i][simpleName]; } } } } } }
/// <summary> /// Возвращает все источники мастеров по иерархии для указанного источника данных /// </summary> /// <param name="propSource">Источник данных от которого начнется проход по иерархии мастеров</param> /// <returns>Список всех источников мастеров, полученных по иерархии</returns> private List <StorageStructForView.PropSource> GetAllLinkedStoragesFroPropSource(StorageStructForView.PropSource propSource) { if (propSource.LinckedStorages == null || propSource.LinckedStorages.Length == 0) { return(new List <StorageStructForView.PropSource>()); } var result = new List <StorageStructForView.PropSource>(); foreach (var source in propSource.LinckedStorages) { result.Add(source); var linkedStorages = GetAllLinkedStoragesFroPropSource(source); result.AddRange(linkedStorages); } return(result); }