Я пытаюсь написать сложный объект (содержит списки) как плоский объект.
public class PersonDTO
{
public Guid Id { get; set; }
public PersonDetails details { get; set; }
public List<Book> Books { get; set; }
}
public class PersonDetails
{
public string FName { get; set; }
public string LName { get; set; }
}
public class Book
{
public Guid Id { get; set; }
public string Name { get; set; }
public List<Page> Pages { get; set; }
}
public class Page
{
public Guid Id { get; set; }
}
Количество записей csv должно соответствовать длине внутренней коллекции.
Например, у PersonDTO есть список книг, у книги есть список страниц. Я хотел бы получить следующий csv:
personId | FName | LName | BookId | BookName | PageId
1 | name1 | name1 | 1 | book1 | 1
1 | name1 | name1 | 1 | book1 | 2
1 | name1 | name1 | 1 | book1 | 3
1 | name1 | name1 | 2 | book2 | 1
1 | name1 | name1 | 2 | book2 | 2
2 | name2 | name2 | 3 | book3 | 1
2 | name2 | name2 | 3 | book3 | 2
2 | name2 | name2 | 3 | book3 | 3
Я нашел несколько способов реализовать это (используя Linq/создать новый плоский объект). Есть ли способ реализовать это только с картами классов CsvHealper?
foreach
— которая преобразуетIEnumerable<PersonDTO>
вIEnumerable<object[]>
, вероятно, ее будет намного легче читать и понимать. (Я сделал это сforeach
и позволил Resharper преобразовать его в LINQ. Это лаконично.) - person Scott Hannen   schedule 26.08.2019public static void WriteToStream(Stream stream, IEnumerable<PersonDTO> people) { using (var w = new StreamWriter(stream)) { w.WriteLine("personId | FName | LName | BookId | BookName | PageId"); foreach (var p in people) { foreach (var b in p.Books) { foreach (var g in b.Pages) { w.WriteLine(string.Join("|", p.Id, p.details.FName, p.details.LName, b.Id, g.Id)); } } } } }
- person Scott Hannen   schedule 26.08.2019