Лучший способ преобразовать универсальную коллекцию ObjectResult (тип данных Entity Framework) в коллекцию универсальных списков? - PullRequest
0 голосов
/ 22 января 2012

Рассмотрим приведенную ниже программу

 public static void Fill<T1, T2>(ObjectResult<T1> Source, List<T2> Destination)
            where T2 : new()
        {
            Destination.AddRange(Source.Select(CreateMapping<T1, T2>()));
        }

        public static Func<T1, T2> CreateMapping<T1, T2>()
        where T2 : new()
        {
            var typeOfSource = typeof(T1);
            var typeOfDestination = typeof(T2);

            // use reflection to get a list of the properties on the source and destination types
            var sourceProperties = typeOfSource.GetProperties();
            var destinationProperties = typeOfDestination.GetProperties();

            // join the source properties with the destination properties based on name
            var properties = from sourceProperty in sourceProperties
                             join destinationProperty in destinationProperties
                             on sourceProperty.Name equals destinationProperty.Name
                             select new { SourceProperty = sourceProperty, DestinationProperty = destinationProperty };

            return (x) =>
            {
                var y = new T2();

                foreach (var property in properties)
                {
                    var value = property.SourceProperty.GetValue(x, null);
                    property.DestinationProperty.SetValue(y, value, null);
                }

                return y;
            };
        }

Где мы принимаем коллекцию ObjectResult (тип данных Entity Framework) и возвращаем общий список.Он работает нормально, но в определенных ситуациях выдает исключение, поскольку «объект не может быть перечислен дважды» ...

Есть ли лучший способ переписать функцию?

1 Ответ

3 голосов
/ 22 января 2012

Если у вас есть проблема с множественным перечислением ObjectResult, просто не передавайте его своим методам и управляйте перечислением самостоятельно:

public static void Fill<T1, T2>(List<T1> Source, List<T2> Destination)

и позвоните по номеру

Fill(objectResult.ToList(), destinationList);

Btw. почему бы не использовать AutoMapper вместо?

...