2017-02-27 54 views
1

我刚刚开始玩Josh Close的CsvHelper组件。但是我还没有完全理解映射的概念。我有一类Order,看起来像这样:如何使用CsvHelper将IList <T>写入csv文件?

public class Order 
{ 
    public int Id { get; set; } 

    public IList<Address> Addresses { get; set; } 
} 

其中Address看起来是这样的:

public class Address 
{ 
    public string Name { get; set; } 

    public string City { get; set; } 
} 

现在,我想这些类写入csv文件。示例输出可能是这样的:

Order.Id;Order.Address.Name;Order.Address.City 
1;"Bob Miller";"London" 

我有两个映射类OrderMapAddressMap

public sealed class OrderMap : CsvClassMap<Order> 
{ 
    public OrderMap() 
    { 
    Map (m => m.Id); 
    Map (m => m.Addresses).Index (0); 
    } 
} 

public sealed class AddressMap : CsvClassMap<Address> 
{ 
    public AddressMap() 
    { 
    Map (m => m.Name); 
    Map (m => m.City); 
    } 
} 

但是,这将产生以下输出:

Id,Addresses 
1,CsvHelperClassMappingTest.Address 

所以,我是什么在这里失踪?

回答

0

据我所知,CsvClassMap只用于阅读,而不是写作。要获得要查找的输出,只需将复杂的Order对象映射到与CSV中想要的布局相匹配的平面对象。定义类,像这样:

class FlatOrder 
{ 
    public FlatOrder(Order order) 
    { 
     Id = order.Id; 
     var firstAddress = order.Address[0]; 
     AddressName = firstAddress.Name; 
     AddressCity = firstAddress.City; 
    } 

    public int Id { get; set; } 

    public string AddressName { get; set; } 

    public string AddressCity { get; set; } 
} 

然后映射,写你的对象:

var flatOrders = orders.Select(o => new FlatOrder(o)); 
csv.WriteRecords(flatOrders); 

如果你感觉懒得做,你甚至可以使用匿名类型,而不是定义一人突前。

+0

建议的解决方案有效。任何人都可以确认'CsvClassMap'和自动映射仅适用于阅读目的吗? –

+0

我对于仅用于阅读的'CsvClassMap'显然是错误的。正如你可以看到在[这个测试文件(https://github.com/JoshClose/CsvHelper/blob/master/src/CsvHelper.Tests/CsvWriterMappingTests.cs),它们用于书写,但我不知道的使用规则。我仍然相信投射到平面物体更简单,更直接。 –