Сопоставление свойства IEnumerable с CSVHelper

у меня есть класс User, который может иметь несколько контактных номеров. Я использую CsvHelper для создания отчета о пользователях, который создаст CSV-файл с именем пользователя и контактными данными. каждый номер контакта должен отображаться в отдельном столбце, с типом номера контакта в качестве заголовка столбца.

ниже у меня ContactNumber и User классы, а также UserMap класс, который должен форматировать мой CSV-файл соответственно:

public class ContactNumber
{
    public string ContactType { get; set; }
    public string Number { get; set; }
}

public class User
{
    public string Name { get; set; }
    public IEnumerable<ContactNumber> ContactNumbers{ get; set;}
}

public sealed class UserMap : CsvClassMap<User>
{
    public UserMap()
    {
        Map(m => m.Name).Name("Username");
        // Incorrect Code
        Map(m => m.ContactNumbers).Name(c => c.ContactType);
    }
}

как я должен сопоставлять свойство IEnumerable ContactNumbers для достижения желаемого результата?

2 ответов


Это не дубликат CsvHelper-чтение в нескольких Столбцах в один список поскольку этот вопрос задает, как конвертировать из модели в CSV, а не наоборот. Я решил это, создав промежуточную модель. Поэтому сначала вы конвертируете исходную модель (пользователя) в свою промежуточную модель (контакт), затем сопоставляете эту модель и создаете CSV.


Я знаю, что это старый вопрос, но я создал другое решение, поместив следующее свойство в мой DTO (класс пользователя).

public string ConcatenatedUserNumbers
    {
        get
        {
            if (ContactNumbers != null && ContactNumbers.Any())
            {
                return string.Join("; ", ContactNumbers.Select(a => a.Number));
            }
            return string.Empty;
        }
    }

затем я просто сопоставляю это свойство в CsvHelper следующим образом:

Map(a => a.ConcatenatedUserNumbers).Name("User Numbers");

вы, очевидно, можете сделать то же самое для типов пользователей или иметь метод, который получает оба. Данные могут быть не идеальными, но конечный пользователь все равно может использовать функциональность "фильтра" в excel, и он будет удобочитаем. Все без избытка сопоставления и т. д.

Примечание: Если это дополнительное свойство предназначено только для сопоставления CSV, вы также можете создать класс CSVUser: User. Вы бы поместили предлагаемое свойство только на CSVUser.

Я надеюсь, что это помогает кто-то.