【问题标题】:Error exporting to CSV when there are reference maps有参考地图时导出到 CSV 时出错
【发布时间】:2019-08-12 22:04:33
【问题描述】:

我有一个Student 班级,其中每个学生记录都有一个Results 列表。 我需要将结果导出到 CSV 并且我正在使用CsvHelper

public class Student
{
   public string Id { get; set; }
   public string Name { get; set; }
   public Result[] Grades { get; set; }
}

public class Result
{
   public string Subject { get; set; }
   public decimal? Marks { get; set; }
}

我正在使用参考地图来映射结果列表,但是在导出到 CSV 时会抛出错误。

映射代码

public sealed class StudentResultExportMap : ClassMap<Student>
{
    public StudentResultExportMap ()
    {
        AutoMap();
        References<GradesMap>(m => m.Grades);
    }
}

public sealed class GradesMap: ClassMap<Result>
{
    public GradesMap()
    {
        Map(m => m.Subject);
        Map(m => m.Marks);
    }
}

错误

没有为类型定义属性“System.String Subject” '{namespace}.GetStudentResults+Result[]' 参数名称:属性

【问题讨论】:

    标签: c# export-to-csv csvhelper automap


    【解决方案1】:

    很遗憾,References&lt;GradesMap&gt;(m =&gt; m.Grades); 不适用于 Result 数组。它适用于个人结果。我有一个解决方案,它覆盖了ResultToString() 方法以使成绩变平。它可能对您有用,具体取决于您的需要。

    public class Result
    {
        public string Subject { get; set; }
        public decimal? Marks { get; set; }
        public override string ToString()
        {
            return $"{Subject} = {Marks}";
        }
    }
    

    对您的 StudentResultExportMap 稍作更改。您可以在.Index(2, 7) 上设置第二个数字来处理您认为学生可能拥有的最大成绩数。

    public sealed class StudentResultExportMap : ClassMap<Student>
    {
        public StudentResultExportMap()
        {
            AutoMap();
            Map(m => m.Grades).Name("Grade").Index(2, 7);
        }
    }
    

    然后您将获得Id, Name, Grade1, Grade2, Grade3, Grade4, Grade5, Grade6,每个年级的toString() 值为Result

    var records = new List<Student>
    {
        new Student{ Id = "1", Name = "First", Grades =  new [] {
            new Result { Subject = "Subject1", Marks = (decimal)2.5 } ,
            new Result { Subject = "Subject2", Marks = (decimal)3.5 } }},
        new Student{ Id = "2", Name = "Second", Grades =  new [] {
            new Result { Subject = "Subject1", Marks = (decimal)3.5 } ,
            new Result { Subject = "Subject2", Marks = (decimal)4.0 } }}
    };
    
    using (var writer = new StreamWriter("path\\to\\StudentResults.csv"))
    using (var csv = new CsvWriter(writer))
    {
        csv.Configuration.RegisterClassMap<StudentResultExportMap>();
        csv.WriteRecords(records);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多