There is a construction of classes

importMeteringDeviceDataRequest = new importMeteringDeviceDataRequest { FIASHouseGuid = res.FIASHouseGUID.ToString(), MeteringDevice = new importMeteringDeviceDataRequestMeteringDevice[] { new importMeteringDeviceDataRequestMeteringDevice { TransportGUID = Guid.NewGuid().ToString(), Item = new MeteringDeviceFullInformationType { BasicChatacteristicts = new MeteringDeviceBasicCharacteristicsType { MeteringDeviceNumber = res.MeteringDeviceNumber, MeteringDeviceModel = res.MeteringDeviceModel, MeteringDeviceStamp = res.MeteringDeviceStamp, .... И.Т.Д 

I am importMeteringDeviceDataRequestMeteringDevice[] this importMeteringDeviceDataRequestMeteringDevice[] array, but I still need to pass this parameter FIASHouseGuid = res.FIASHouseGUID.ToString() , It goes outside the array, and I don’t understand how to do it correctly. Initially, the task is to pass these parameters in a soap request, generate proxy classes and give them values, if you make one record at a time, everything is ok, but you can send 100 records at a time. Only here FIASHouseGuid from the array is knocked out and how to transfer it is not clear. The table is one there all records are stored.

Full text

 public async void ImportMeteringDataAdd() { inserted = 0; var importIPU = Task.Factory.StartNew(() => { IsBusy = true; soapEntities db = new soapEntities(); AuthClass auth = new Data.AuthClass(); var service = new HouseManagementPortsTypeAsyncClient(); service.ClientCredentials.UserName.UserName = auth.LoginEais; service.ClientCredentials.UserName.Password = auth.PasswordEais; List<string> accGuid = new List<string>(); var r = db.eias_MeteringDevice.Include("eias_MeteringDevice_Account").Select(c => c).ToList(); count = r.Count; foreach (var res in r) { foreach (var item in res.eias_MeteringDevice_Account) { accGuid.Add(item.AccountGUID.ToString()); } try { var request = new importMeteringDeviceDataRequest1 { RequestHeader = new RequestHeader { Date = DateTime.Now, MessageGUID = Guid.NewGuid().ToString(), ItemElementName = ItemChoiceType.orgPPAGUID, Item = auth.GuidORG, IsOperatorSignature = true, IsOperatorSignatureSpecified = true }, importMeteringDeviceDataRequest = new importMeteringDeviceDataRequest { FIASHouseGuid = res.FIASHouseGUID.ToString(), MeteringDevice = new importMeteringDeviceDataRequestMeteringDevice[] { new importMeteringDeviceDataRequestMeteringDevice { TransportGUID = Guid.NewGuid().ToString(), Item = new MeteringDeviceFullInformationType { BasicChatacteristicts = new MeteringDeviceBasicCharacteristicsType { MeteringDeviceNumber = res.MeteringDeviceNumber, MeteringDeviceModel = res.MeteringDeviceModel, MeteringDeviceStamp = res.MeteringDeviceStamp, CommissioningDate = res.CommissioningDate.Value, CommissioningDateSpecified = true , // VerificationInterval = new nsiRef { } InstallationDate = res.InstallationDate.Value, RemoteMeteringMode = res.RemoteMeteringMode.Value, TemperatureSensor = res.TemperatureSensor.Value, PressureSensor =res.PressureSensor.Value , Item = new MeteringDeviceBasicCharacteristicsTypeResidentialPremiseDevice { AccountGUID = accGuid.ToArray() , PremiseGUID = res.Residential_PremiseGUID.ToString().ToLower() }, // // FirstVerificationDate = res.LastVerificationDate.Value }, Item = true, Items = new MunicipalResourceNotElectricType[] { new MunicipalResourceNotElectricType { MeteringValue = res.MeteringValueT1.Value,//Первоначальное значение MunicipalResource = new Gis.Infrastructure.HouseManagementService.nsiRef { Code = res.MunicipalResource, GUID = res.MunicipalResourceGUID.ToString().ToLower() } } } } // } } } } }; var result = service.importMeteringDeviceData(request); GuidService gs = new GuidService { GuidID = new Guid(result.AckRequest.Ack.MessageGUID), DateGuid = DateTime.Now, MetodId = 14, Descript = result.AckRequest.Ack.RequesterMessageGUID, State = 1 }; db.GuidServices.Add(gs); db.SaveChanges(); for (int i = 0; i < accGuid.Count; i++) { ImportMeteringDevice md = new Data.ImportMeteringDevice { GuidQ = new Guid(result.AckRequest.Ack.MessageGUID), AccountGUID = new Guid(accGuid[i].ToString()), // MetKey = res.met_key, State = 1 }; db.ImportMeteringDevices.Add(md); db.SaveChanges(); } inserted++; updateProgress(inserted); } catch (Exception e) { System.Windows.Forms.MessageBox.Show(e.Message.ToString()); BrushSend = System.Windows.Media.Brushes.Red; inserted++; updateProgress(inserted); } accGuid.Clear(); } BrushSend = System.Windows.Media.Brushes.LimeGreen; }); await importIPU; IsBusy = false; } 
  • one
    Such nested dolls for creating new objects should be broken down into calls to individual methods, otherwise your code looks like creepy tangled noodles, it is hard to read and even harder to understand. And as a matter of fact, the logic is not quite clear: "... but I still need to pass this parameter FIASHouseGuid = res.FIASHouseGUID.ToString (), ...". Where to transfer? Explain, and better show the code. - Bulson
  • Show me how to break into calls I'm new - Konstantin Kozlov

1 answer 1

It is necessary to act approximately in this spirit:

 public async void ImportMeteringDataAdd() { IsBusy = true; try { bool resultImport = await ImportIPU(); if (resultImport) { BrushSend = System.Windows.Media.Brushes.LimeGreen; IsBusy = false; } } catch (Exception e) { System.Windows.Forms.MessageBox.Show(e.Message.ToString()); BrushSend = System.Windows.Media.Brushes.Red; inserted++; updateProgress(inserted); } } private async Task<bool> ImportIPU() { AuthClass auth = new Data.AuthClass(); var service = await GetService(auth); soapEntities db = new soapEntities(); var ress = db.eias_MeteringDevice .Include("eias_MeteringDevice_Account") .Select(c => c) .ToList(); count = ress.Count; inserted = 0; List<string> accGuid; foreach (var res in ress) { accGuid = await GetListAccountGUID(res); var request = await GetMeteringDeviceDataRequest(auth, res, accGuid); var result = service.importMeteringDeviceData(request); SaveGuidService(result, db); SaveImportMeteringDevice(result, db, accGuid.Count); inserted++; updateProgress(inserted); } return true; } //Вместо object нужно подставить тип res private Task<List<string>> GetListAccountGUID(object res) { var result = new List<string>(); foreach (var item in res.eias_MeteringDevice_Account()) { result.Add(item.AccountGUID.ToString()); } return Task.FromResult(result); } //Вместо object нужно подставить тип service private Task<object> GetService(AuthClass auth) { var service = new HouseManagementPortsTypeAsyncClient(); service.ClientCredentials.UserName.UserName = auth.LoginEais; service.ClientCredentials.UserName.Password = auth.PasswordEais; return Task.FromResult(service); } //Вместо object нужно подставить тип res private Task<importMeteringDeviceDataRequest1> GetMeteringDeviceDataRequest(AuthClass auth, object res, List<string> accGuid) { var result = new importMeteringDeviceDataRequest1 { RequestHeader = GetRequestHeader(auth), importMeteringDeviceDataRequest = GetCoreRequest(res, accGuid) }; return Task.FromResult(result); } private RequestHeader GetRequestHeader(AuthClass auth) { var result = new RequestHeader { Date = DateTime.Now, MessageGUID = Guid.NewGuid().ToString(), ItemElementName = ItemChoiceType.orgPPAGUID, Item = auth.GuidORG, IsOperatorSignature = true, IsOperatorSignatureSpecified = true }; return result; } //Вместо object нужно подставить тип res private importMeteringDeviceDataRequest GetCoreRequest(object res, List<string> accGuid) { var result = new importMeteringDeviceDataRequest { FIASHouseGuid = res.FIASHouseGUID.ToString(), MeteringDevice = GetArrayMeteringDevice(res, accGuid) }; return result; } private importMeteringDeviceDataRequestMeteringDevice[] GetArrayMeteringDevice(object res, List<string> accGuid) { var result = new importMeteringDeviceDataRequestMeteringDevice[] { //Принцип надеюсь вам понятен //Далее я думаю, вы справитесь самостоятельно:) }; return result; } //Вместо object нужно подставить тип result private void SaveGuidService(object result, soapEntities db) { GuidService gs = new GuidService { GuidID = new Guid(result.AckRequest.Ack.MessageGUID), DateGuid = DateTime.Now, MetodId = 14, Descript = result.AckRequest.Ack.RequesterMessageGUID, State = 1 }; db.GuidServices.Add(gs); db.SaveChanges(); } //Вместо object нужно подставить тип private void SaveImportMeteringDevice(object result, soapEntities db, int count) { for (int i = 0; i < count; i++) { ImportMeteringDevice md = new Data.ImportMeteringDevice { GuidQ = new Guid(result.AckRequest.Ack.MessageGUID), AccountGUID = new Guid(accGuid[i].ToString()), // MetKey = res.met_key, State = 1 }; db.ImportMeteringDevices.Add(md); db.SaveChanges(); } } }