【问题标题】:CsvHelper : Intialize a map memberCsvHelper : 初始化地图成员
【发布时间】:2019-06-26 23:45:39
【问题描述】:

想象一下这样的 EF dbSet 集合:

public class Employee {
  ...
  public string FirstName { get; set; }
  public List<Badge> Badge { get; set; } 
}

public class Badge {
  public long CSN { get; set; }
  public int EmployeeId { get; set; }
  public int Type { get; set; }
}

这个模型用于我的 SGBB,我想用它从 CSV 文件中导入数据。但是这个文件有一点点不同。它只给一个这样的徽章:

FIRSTNAME;CSN;TYPE
Jerome;12345;1

我使用了 CollectionGenericConverter,用新记录初始化列表。

Map(m => m.Firstname).Name("Firstname");
Map(m => m.Badges).Name("CSN").TypeConverter<BadgeConverter>();

...

public class BadgeConverter : CollectionGenericConverter {
   public override object ConvertFromString(String text, IReaderRow row, MemberMapData memberMapData) {
       return new List<Badge> {
           new Badge {
               CSN = Convert.ToInt16(text)
           }
       };
   }
}

我对第二个值有疑问,使用第二个转换器重置徽章列表:

 Map(m => m.Badges).Name("Type").TypeConverter<AnotherOneBadgeConverter>();

直接设置第一项不行:

 Map(m => m.Badges[0].Type).Name("Type");

怎么做?

【问题讨论】:

    标签: c# entity-framework csvhelper


    【解决方案1】:

    这样的事情可能对你有用。

    public class Program
    {
        public static void Main(string[] args)
        {
            using (MemoryStream stream = new MemoryStream())
            using (StreamWriter writer = new StreamWriter(stream))
            using (StreamReader reader = new StreamReader(stream))
            using (CsvReader csv = new CsvReader(reader))
            {
                writer.WriteLine("FIRSTNAME;CSN;TYPE");
                writer.WriteLine("Jerome;12345;1");
                writer.Flush();
                stream.Position = 0;
    
                csv.Configuration.Delimiter = ";";
                csv.Configuration.RegisterClassMap<EmployeeMap>();
    
                var records = csv.GetRecords<Employee>().ToList();
            }
        }
    }
    
    public class Employee
    {  
        public string FirstName { get; set; }
        public List<Badge> Badge { get; set; }
    }
    
    public class Badge
    {
        public long CSN { get; set; }
        public int EmployeeId { get; set; }
        public int Type { get; set; }
    }
    
    public class EmployeeMap: ClassMap<Employee>
    {
        public EmployeeMap()
        {
            Map(m => m.FirstName).Name("FIRSTNAME");
            Map(m => m.Badge).ConvertUsing(row =>
            {
                var list = new List<Badge>
                {
                    new Badge { CSN = row.GetField<long>("CSN"), Type = row.GetField<int>("TYPE") },
                };
                return list;
            });
        }
    }
    

    【讨论】:

    • 完美!谢谢大卫
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-14
    • 2019-09-10
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多