Карта AutoMapper DataRow Для списка объектов, управлять дубликатами - PullRequest
0 голосов
/ 29 апреля 2020

У меня есть DataTable с этими данными:

enter image description here

Затем у меня есть эти два класса: *

public class User
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Surname { get; set; }

    public IEnumerable<Consent> ConsentList { get; set; }
}

public class Consent
{
    public string Type { get; set; }
    public string Origin { get; set; }
    public DateTime? Date { get; set; }
    public bool? ConsentValue { get; set; }
}

Кроме того, у меня есть это отображение

    CreateMap<DataRow, User>()
                .ForMember(dest => dest.Id, orig => orig.MapFrom(row => (int)row["Id"]))
                .ForMember(dest => dest.Name, orig => orig.MapFrom(row => row["Name"].ToString()))
                .ForMember(dest => dest.Surname, orig => orig.MapFrom(row => row["Surname"].ToString()))
                .ForMember(dest => dest.ConsentList, orig => orig.MapFrom<DataRowToHistoryDataResolver>());

    public class DataRowToHistoryDataResolver : IValueResolver<DataRow, User, IEnumerable<Consent>>
    {
        public IEnumerable<Consent> Resolve(DataRow source, User destination, IEnumerable<Consent> destMember, ResolutionContext context)
        {
            var consentDataList = new List<Consent>();

            var consentData = new Consent();
            var consentName = source["Type"].ToString();
            consentData.Type = consentName.First().ToString().ToUpper() + consentName.Substring(1).ToLower();

            consentData.ConsentValue = (bool)source["Consent"];

            consentData.Origin = source["Origin"].ToString();

            consentData.Date = null;
            var dtDate = new DateTime();
            if (DateTime.TryParse(source["Date"].ToString(), out dtDate))
                consentData.Date = dtDate;

            consentDataList.Add(consentData);

            return consentDataList;
        }
    }

   // **userDT is the DataTable filled**
   var rows = new List<DataRow>(userDT.Rows.OfType<DataRow>());

   var userDataList = mapper.Map<List<DataRow>, List<UserData>>(rows);

Результатом этого отображения является список пользователей с одним элементом в ConsentList для каждого объекта и с дублирующимися пользователями, как в DataTable. Например:

    ID=6, Name=Name1, Surname=Surname1, ConsentList { 
        (Type=marketing, Origin=Origin1, Date=2020-04-16, Consent=0)
    },
    ID=6, Name=Name1, Surname=Surname1, ConsentList { 
        (Type=newsletter, Origin=Origin1, Date=2020-04-16, Consent=1)
    },
    ID=6, Name=Name1, Surname=Surname1, ConsentList { 
        (Type=policy, Origin=Origin3, Date=2020-03-20, Consent=1)
    },
    ....,
    ID=7, Name=Name2, Surname=Surname2, ConsentList { 
        (Type=marketing, Origin=Origin1, Date=2020-04-21, Consent=0)
    }
    ID=7, Name=Name2, Surname=Surname2, ConsentList { 
        (Type=marketing, Origin=Origin2, Date=2020-03-24, Consent=1)
    }
    ID=7, Name=Name2, Surname=Surname2, ConsentList { 
        (Type=newsletter, Origin=Origin1, Date=2020-04-21, Consent=0)
    },
    ....

То, что я хочу, это список пользователей с объектом для каждого дублирующегося пользовательского данных (идентификатор, имя и фамилия) в DataTable и с ConsentList, заполненным всеми данными доступных строк ( тип, происхождение, дата и согласие). Например:

    ID=6, Name=Name1, Surname=Surname1, ConsentList { 
        (Type=marketing, Origin=Origin1, Date=2020-04-16, Consent=0),
        (Type=newsletter, Origin=Origin1, Date=2020-04-16, Consent=1),
        (Type=policy, Origin=Origin3, Date=2020-03-20, Consent=1),
        ....
    },
    ID=7, Name=Name2, Surname=Surname2, ConsentList { 
        (Type=marketing, Origin=Origin1, Date=2020-04-21, Consent=0),
        (Type=marketing, Origin=Origin2, Date=2020-03-24, Consent=1),
        (Type=newsletter, Origin=Origin1, Date=2020-04-21, Consent=0),
        ....
    },
    ....

Кто-нибудь может подсказать, как получить этот результат с помощью AutoMapper?

Спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...