2017-02-27 62 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),它們用於書寫,但我不知道的使用規則。我仍然相信投射到平面物體更簡單,更直接。 –