private async Task InternalLoadDtoAsync <TTargetDto, TKeyProvider>(RelatedDtoProperty relatedProperty, RelatedValueType idType, IDtoLoadRule loaderRule, TTargetDto[] arrTargetDtos, TKeyProvider[] arrKeyProviders) where TTargetDto : class where TKeyProvider : class { var dtoType = relatedProperty.DtoType; var keyProviderWithIds = arrKeyProviders.ToDictionary(x => x, keyProvider => idType.Property.GetValue(keyProvider)); var idsToLoad = keyProviderWithIds.Values.Where(x => x != null).ToArray(); Dictionary <object, object> dictLoadedDtos = null; if (idsToLoad.Any()) { object[] relatedDtos = (await loaderRule.LoadAsObjectAsync(_serviceProvider, idsToLoad)).ToArray(); dictLoadedDtos = relatedDtos.ToDictionary(x => loaderRule.GetKey(x), x => x); } for (var index = 0; index < arrTargetDtos.Length; index++) { var targetDto = arrTargetDtos[index]; var keyProvider = arrKeyProviders[index]; object propValue = null; var desiredDtoKey = keyProviderWithIds[keyProvider]; if (desiredDtoKey != null && dictLoadedDtos.ContainsKey(desiredDtoKey)) { propValue = dictLoadedDtos[desiredDtoKey]; } dtoType.Property.SetValue(targetDto, propValue); } }
private async Task InternalLoadDtoArrayAsync <TTargetDto, TKeyProvider>(RelatedDtoProperty relatedProperty, RelatedValueType idType, IDtoLoadRule loaderRule, TTargetDto[] arrTargetDtos, TKeyProvider[] arrKeyProviders) where TTargetDto : class where TKeyProvider : class { var dtoType = relatedProperty.DtoType; var keyProviderWithIds = arrKeyProviders.ToDictionary(x => x, keyProvider => ((IEnumerable)idType.Property.GetValue(keyProvider)).Cast <object>().ToArray()); var idsToLoad = keyProviderWithIds.Values.Where(x => x != null).SelectMany(x => x).Where(x => x != null).Distinct().ToArray(); Dictionary <object, object> dictLoadedDtos = null; var dtoElementType = dtoType.ElementType; if (idsToLoad.Any()) { object[] relatedDtos = (await loaderRule.LoadAsObjectAsync(_serviceProvider, idsToLoad)).ToArray(); dictLoadedDtos = relatedDtos.ToDictionary(x => loaderRule.GetKey(x), x => x); } for (var index = 0; index < arrTargetDtos.Length; index++) { var targetDto = arrTargetDtos[index]; var keyProvider = arrKeyProviders[index]; object propValue = null; var desiredDtoKeys = keyProviderWithIds[keyProvider]; if (desiredDtoKeys != null) { var dtoArray = Array.CreateInstance(dtoType.ElementType, desiredDtoKeys.Length); for (int i = 0; i < desiredDtoKeys.Length; i++) { var desiredDtoKey = desiredDtoKeys[i]; object dto = null; if (desiredDtoKey != null && dictLoadedDtos.ContainsKey(desiredDtoKey)) { dto = dictLoadedDtos[desiredDtoKey]; } dtoArray.SetValue(dto, i); } propValue = dtoArray; } dtoType.Property.SetValue(targetDto, propValue); } }