2015-06-16 42 views
7

ile IEnumerable özellik eşleme Çeşitli iletişim numaralarına sahip olan bir User sınıfım var. Kullanıcıların üzerinde bir rapor oluşturmak için CsvHelper kullanıyorum, ki bu kullanıcının adı ve iletişim bilgilerinin bir CSV dosyasını oluşturacaktır. Her iletişim numarası, kendi sütununda, iletişim numarasının sütun başlığı olarak yazılmasıyla birlikte gösterilmelidir.CSVHelper

benim ContactNumber ve User sınıfları yanı sıra buna göre CSV dosyamı biçimlendirmeliyim bir UserMap sınıf var Aşağıda: benim istenen sonucu elde etmek için ContactNumbers arasında IEnumerable özelliği haritalama gerektiğini nasıl

public class ContactNumber 
{ 
    public string ContactType { get; set; } 
    public string Number { get; set; } 
} 

public class User 
{ 
    public string Name { get; set; } 
    public IEnumerable<ContactNumber> ContactNumbers{ get; set;} 
} 

public sealed class UserMap : CsvClassMap<User> 
{ 
    public UserMap() 
    { 
     Map(m => m.Name).Name("Username"); 
     // Incorrect Code 
     Map(m => m.ContactNumbers).Name(c => c.ContactType); 
    } 
} 

?

+0

[CsvHelper - read tek bir listeye birden çok sütun içinde okunabilir] (http://stackoverflow.com/questions/17353454/csvhelper-read-in-multiple-columns-to-a-single-list) – Marco

+1

Lütfen ["Başlıklardaki" etiketler "etiketlerini içerir mi?" Bölümüne bakın. (Http://meta.stackexchange.com/questions/19190/should-questions-include-tags-in-their-titles) "hayır, yapmamalılar" –

cevap

3

Bu soru, CsvHelper - read in multiple columns to a single list'un bir kopyası değildir, çünkü bu soru modelden CSV'ye nasıl dönüştürüleceğini ve başka bir şekilde nasıl dönüştürülmeyeceğini sorar. Bir ara model oluşturarak bunu çözdüm. Bu yüzden önce orijinal modeli (Kullanıcı) modele (Kontak) dönüştürün, sonra bu modeli eşleştirin ve CSV'yi yaratın.

1

Bu eski bir soru biliyorum ama DTO (Kullanıcı sınıfı) üzerinde aşağıdaki özelliği koyarak başka bir çözüm oluşturduk.

Map(a => a.ConcatenatedUserNumbers).Name("User Numbers"); 

Sen kullanıcı türleri için aynı şeyi açıkça olabilir, ya da her ikisi alır bir yöntemi vardır:

public string ConcatenatedUserNumbers 
    { 
     get 
     { 
      if (ContactNumbers != null && ContactNumbers.Any()) 
      { 
       return string.Join("; ", ContactNumbers.Select(a => a.Number)); 
      } 
      return string.Empty; 
     } 
    } 

Sonra sadece bu yüzden gibi CsvHelper bu özelliğine map. Veriler mükemmel olmayabilir, ancak son kullanıcı hala 'filtre' işlevini excel içinde kullanabilir ve insan tarafından okunabilir olacaktır. Fazla eşlemelere gerek kalmadan tüm bunlar.

Not: Bu ekstra özellik yalnızca bir CSV eşlemesi içinse, CSVUser: User sınıfına da girebilirsiniz. Önerilen özelliği yalnızca CSVUser'e yerleştirirsiniz.

Umarım bu birilerinin dışarı çıkmasına yardımcı olur.