Сопоставление свойства 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.
Я надеюсь, что это помогает кто-то.