У меня есть данные результатов запроса, которые представляют собой набор данных о студентах.С каждой коллекцией студентов связана коллекция контактов.
У некоторых студентов нет контактов, у некоторых - несколько.
Мне нужно 2 csv из этой коллекции студентов.Тот, который только для студентов, и тот, с которым у меня проблемы: CSV со строкой для каждого студента и связанного с ним контакта.Если у Бобби нет контактов, то у него 1 строка.Если у Суэзи 3 контакта, то 3 строки ее информации с контактными данными включены в строку.
Я пытаюсь использовать CsvHelper для этого, но не получаю ожидаемого результата.См. Ответ Джоша Клоуса здесь .
Я использую CSV для своих выборочных данных, один студент с 2 контактами, 2 студента с одним контактом каждый.И 1 студент без контактов.
Студенты:
StudentSisId Name
111111 Betty
222222 Veronica
333333 Jughead
444444 Archie
Контакты:
StudentSisId Relationship
111111 Mother
111111 Father
222222 Mother
444444 Father
Мой код: Классы:
public class Student
{
public string StudentSisId { get; set; }
public string Name { get; set; }
public List<Contact> Contacts { get; set; }
}
public class Contact
{
public string StudentSisId { get; set; }
public string Relationship { get; set; }
}
Картография:
public sealed class StudentClassMap : ClassMap<Student>
{
public StudentClassMap()
{
Map(m => m.StudentSisId);
Map(m => m.Name);
Map(m => m.Contacts).Index(2);
}
}
public sealed class ContactClassMap : ClassMap<Contact>
{
public ContactClassMap()
{
Map(m => m.StudentSisId).Index(1);
Map(m => m.Relationship).Index(2);
}
}
Код:
private static void StudentsWithContacts()
{
var csvReader = new ReadCsvFile();
List<Student> students = csvReader.GetDataCollection<Student>(@"c:\temp\studentsWithoutContacts.csv");
List<Contact> contacts = csvReader.GetDataCollection<Contact>(@"c:\temp\contacts.csv");
foreach (var student in students)
{
if (contacts.Any(x => x.StudentSisId == student.StudentSisId))
{
var studentContacts = contacts.Where(x => x.StudentSisId == student.StudentSisId).ToList();
student.Contacts = new List<Contact>();
student.Contacts.AddRange(studentContacts);
}
}
using (var textWriter = File.CreateText(@"c:\temp\studentsWithContacts.csv"))
using (var writer = new CsvWriter(textWriter))
{
writer.WriteHeader<Student>();
writer.WriteRecords(students);
}
}
Это дает результаты (почему Бетти в заголовке?):
Имя StudentSisId 111111 Бетти 222222 Вероника
333333 Jughead
444444 Арчи
Я ожидаю:
StudentSisId Name Relationship
111111 Betty Mother
111111 Betty Father
222222 Veronica Mother
333333 Jughead
444444 Archie Father
Я на правильном пути, или я неправильно понял инструмент?Это образец CsvHelper 3.2.Я могу обновить при необходимости.