В настоящее время я пишу сплющенный объект DTO в CSV, используя csvwriter csvhelper. Есть ли способ условно игнорировать определенные поля, если они еще не были инициализированы или являются пустыми в маппере? Я вижу, что флаг игнорирования принимает логическое значение, но как мне получить доступ к соответствующему полю, чтобы проверить это?

Приносим извинения, если на этот вопрос был дан ответ в другом месте, но он выполнил поиск как проблем github, так и стека overoverflow.

0
P0DD3R5 30 Май 2019 в 17:33

2 ответа

Лучший ответ

Ответ для меня заключался в том, чтобы передать коллекцию полей / столбцов, которые будут игнорироваться в маппере. Это потребовало от меня проверки сбора данных на наличие пустых значений во всех строках, если так, то я могу полностью опустить этот столбец. Затем я передаю эту коллекцию requiredFields в маппер следующим образом.

public sealed class ApplicationCsvWriterMap : ClassMap<ApplicationDto>
{
    public ApplicationCsvWriterMap(List<string> requiredFields)
    {
        Map(m => m.Id).Index(1).Name("AppId").Ignore(!requiredFields.Contains("id"));
        Map(m => m.Status.Text).Index(2).Name("Status").Ignore(!requiredFields.Contains("status"));
        Map(m => m.ApplicationTimestamp).Index(3).Ignore(!requiredFields.Contains("applicationTimestamp"));
        Map(m => m.LastModified).Index(4).Ignore(!requiredFields.Contains("lastModified"));

Затем я могу настроить маппер примерно так, передав коллекцию requiredFields примерно так

  else if (results.Data is List<Application> applications)
            {
                csvWriter.Configuration.RegisterClassMap(new ApplicationCsvWriterMap(results.RequiredFields));
                csvWriter.WriteRecords(_dtoMapper.MapApplications(applications));
            }
0
P0DD3R5 3 Июн 2019 в 15:54

Я был немного смущен этим вопросом, потому что игнорировать это все или ничего. Вы не можете игнорировать поле построчно. Вы либо включаете поле, либо нет. Вы можете игнорировать поле, если, скажем, все записи имели нулевое или пустое значение для определенной переменной-члена.

public static void Main(string[] args)
{    
    var records = new List<Foo> { new Foo { Id = 1, Name = "" }, new Foo { Id = 2 } };

    using (var csv = new CsvWriter(Console.Out))
    {        
        var shouldIgnoreName = records.All(foo => string.IsNullOrEmpty(foo.Name));

        var classMap = new DefaultClassMap<Foo>();
        classMap.AutoMap();
        classMap.Map(m => m.Name).Ignore(shouldIgnoreName);

        csv.Configuration.RegisterClassMap(classMap);
        csv.WriteRecords(records);
    }

    Console.ReadKey();
}

public class Foo
{
    public int Id { get; set; }
    public string Name { get; set; }
}        
1
David Specht 31 Май 2019 в 14:37