Ejemplo n.º 1
0
        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);
            }
        }
Ejemplo n.º 2
0
        private async Task InternalLoadDtoEnumerableAsync <TTargetDto, TKeyProvider>(RelatedDtoProperty.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())
            {
                var 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 dtoList = Activator.CreateInstance(relatedProperty.DtoListType);

                    foreach (var desiredDtoKey in desiredDtoKeys)
                    {
                        object dto = null;

                        if (desiredDtoKey != null && dictLoadedDtos.ContainsKey(desiredDtoKey))
                        {
                            dto = dictLoadedDtos[desiredDtoKey];
                        }

                        relatedProperty.Add.Invoke(dtoList, new[] { dto });
                    }

                    propValue = dtoList;
                }

                dtoType.Property.SetValue(targetDto, propValue);
            }
        }