【发布时间】:2019-08-26 18:35:03
【问题描述】:
我正在尝试将复杂对象(包含列表)编写为平面对象。
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 类映射来实现这一点?
【问题讨论】:
-
可能不是完全匹配,但这可能会有所帮助。 stackoverflow.com/questions/53106857/…
-
我查看了文档并没有看到任何明显的内容。如果您编写一个函数——LINQ 或
foreach——将IEnumerable<PersonDTO>转换为IEnumerable<object[]>,它可能会更容易阅读和理解。 (我是用foreach完成的,然后让 Resharper 将其转换为 LINQ。它很简洁。) -
适合评论
public 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)); } } } } }