Ошибка экспорта в CSV при наличии справочных карт - PullRequest
0 голосов
/ 22 марта 2019

У меня есть класс 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);
    }
}

Error

Свойство 'System.String Subject' не определено для типа '{namespace} .GetStudentResults + Result []' Имя параметра: свойство

1 Ответ

1 голос
/ 22 марта 2019

К сожалению, References<GradesMap>(m => m.Grades); не работает для массива Result.Это будет работать для индивидуального результата.У меня есть одно решение, которое переопределяет ToString() метод Result, чтобы сгладить оценки.Это может работать для вас, в зависимости от того, что вам нужно.

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

Внесите небольшое изменение в свой StudentResultExportMap.Вы можете установить 2-е число на .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);
}
...