【问题标题】:csvhelper - how to create mapper for complex objectcsvhelper - 如何为复杂对象创建映射器
【发布时间】: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&lt;PersonDTO&gt; 转换为IEnumerable&lt;object[]&gt;,它可能会更容易阅读和理解。 (我是用foreach 完成的,然后让 Resharper 将其转换为 LINQ。它很简洁。)
  • 适合评论public static void WriteToStream(Stream stream, IEnumerable&lt;PersonDTO&gt; 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)); } } } } }

标签: c# .net csvhelper


【解决方案1】:

这似乎有效。

public static void Main(string[] args)
{
    var records = GetRecords();
    using (var csv = new CsvWriter(Console.Out))
    {
        csv.Configuration.RegisterClassMap<PersonMap>();
        csv.Configuration.RegisterClassMap<BookMap>();
        csv.Configuration.RegisterClassMap<PageMap>();

        csv.WriteHeader<PersonDTO>();
        csv.WriteHeader<Book>();
        csv.WriteHeader<Page>();
        csv.NextRecord();

        foreach (var person in records)
        {
            foreach (var book in person.Books)
            {
                foreach (var page in book.Pages)
                {
                    csv.WriteRecord(person);
                    csv.WriteRecord(book);
                    csv.WriteRecord(page);
                    csv.NextRecord();
                }
            }
        }
    }

    Console.ReadKey();
}

public sealed class PersonMap : ClassMap<PersonDTO>
{
    public PersonMap()
    {
        Map(m => m.Id).Name("PersonId");
        References<PersonDetailsMap>(m => m.details);
    }
}

public sealed class PersonDetailsMap : ClassMap<PersonDetails>
{
    public PersonDetailsMap()
    {
        Map(m => m.FName);
        Map(m => m.LName);
    }
}

public sealed class BookMap : ClassMap<Book>
{
    public BookMap()
    {
        Map(m => m.Id).Name("BookId");
        Map(m => m.Name).Name("BookName");
    }
}

public sealed class PageMap : ClassMap<Page>
{
    public PageMap()
    {
        Map(m => m.Id).Name("PageId");
    }
}

【讨论】:

    猜你喜欢
    • 2014-09-20
    • 1970-01-01
    • 2016-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-21
    相关资源
    最近更新 更多