public async Task <IActionResult> GetDataFiles([FromRoute] long?id, [FromQuery] bool withUrl) { if (id == null) { return(JsonBadRequest("DataSet ID is required.")); } var dataSet = await dataSetRepository.GetDataSetIncludeDataSetEntryAndDataAsync(id.Value); if (dataSet == null) { return(JsonNotFound($"DataSet Id {id.Value} is not found.")); } var model = new DataFileOutputModel(dataSet); if (dataSet.DataSetEntries != null) { //エントリの作成開始 var entities = new Dictionary <string, List <ApiModels.DataApiModels.DataFileOutputModel> >(); var flatEntries = new ConcurrentQueue <ApiModels.DataApiModels.DataFileOutputModel>(); //空のデータ種別も表示したい&順番を統一したいので、先に初期化しておく foreach (var dataType in dataTypeRepository.GetAllWithOrderby(d => d.SortOrder, true)) { entities.Add(dataType.Name, new List <ApiModels.DataApiModels.DataFileOutputModel>()); } //エントリを並列で取得する if (dataSet.IsFlat) { dataSet.DataSetEntries.AsParallel().ForAll(entry => { var dataFiles = dataLogic.GetDataFiles(entry.Data, withUrl); foreach (var x in dataFiles) { flatEntries.Enqueue(x); } }); } else { dataSet.DataSetEntries.AsParallel().ForAll(entry => { var key = entry.DataType.Name; var dataFiles = dataLogic.GetDataFiles(entry.Data, withUrl); lock (entities) { entities[key].AddRange(dataFiles); } }); } model.SetEntries(entities); model.FlatEntries = flatEntries; } return(JsonOK(model)); }
/// <summary> /// 指定したIDの全ファイル情報を取得する。 /// </summary> /// <param name="data">データ</param> /// <param name="withUrl">結果にダウンロード用のURLを含めるか</param> public IEnumerable <DataFileOutputModel> GetDataFiles(Data data, bool withUrl) { var result = new List <DataFileOutputModel>(); foreach (var property in data.DataProperties) { var model = new DataFileOutputModel { Id = data.Id, Key = property.Key, FileId = property.Id, FileName = property.DataFile.FileName }; if (withUrl) { model.Url = storageLogic.GetPreSignedUriForGet(ResourceType.Data, property.DataFile.StoredPath, property.DataFile.FileName, true).ToString(); } result.Add(model); } return(result); }
public async Task <IActionResult> GetDataFiles([FromRoute] long?id, [FromQuery] bool withUrl) { if (id == null) { return(JsonBadRequest("DataSet ID is required.")); } var dataSet = await dataSetRepository.GetDataSetIncludeDataSetEntryAsync(id.Value); if (dataSet == null) { return(JsonNotFound($"DataSet Id {id.Value} is not found.")); } var model = new DataFileOutputModel(dataSet); if (dataSet.DataSetEntries != null) { //エントリの作成開始。最初はDictionary形式で var entities = new Dictionary <string, List <ApiModels.DataApiModels.DataFileOutputModel> >(); //空のデータ種別も表示したい&順番を統一したいので、先に初期化しておく foreach (var dataType in dataTypeRepository.GetAllWithOrderby(d => d.SortOrder, true)) { entities.Add(dataType.Name, new List <ApiModels.DataApiModels.DataFileOutputModel>()); } //エントリを一つずつ突っ込んでいく。件数次第では遅いかも。 foreach (var entry in dataSet.DataSetEntries) { string key = entry.DataType.Name; var dataFiles = dataLogic.GetDataFiles(entry.DataId, withUrl); entities[key].AddRange(dataFiles); } model.SetEntries(entities); } return(JsonOK(model)); }