C# EntityFramework提取到CSV,但保留数据批注

C# EntityFramework提取到CSV,但保留数据批注,c#,entity-framework,export-to-csv,csvhelper,C#,Entity Framework,Export To Csv,Csvhelper,我正在尝试将一个相当复杂的模型(就层次结构而言)导出到CSV文件中。我正在尝试各种方法,但它们都缺少一些东西,或者需要大量的编码,我希望避免这些 我希望得到的结果是值的CSV提取,CSV头来自我在EF模型本身上使用的DisplayName属性注释 我试过CSVHelper,但automapper功能有点混乱,不可能再忽略某些具有属性的字段;此外,它不支持从EFDisplayAttribute命名 我还尝试使用AutoMapper将模型映射到一个单独的CSV模型,然后使用CsvHelper转储此模

我正在尝试将一个相当复杂的模型(就层次结构而言)导出到CSV文件中。我正在尝试各种方法,但它们都缺少一些东西,或者需要大量的编码,我希望避免这些

我希望得到的结果是值的CSV提取,CSV头来自我在EF模型本身上使用的
DisplayName
属性注释

我试过CSVHelper,但automapper功能有点混乱,不可能再忽略某些具有属性的字段;此外,它不支持从EF
DisplayAttribute
命名

我还尝试使用AutoMapper将模型映射到一个单独的CSV模型,然后使用CsvHelper转储此模型,但最后我又编写了大量代码来设置列名

你知道有什么快速的解决办法来满足我的需要吗?我可能会进入CsvHelper源代码并重写使用属性名的部分,但我不知道代码库有多复杂。有人知道吗


非常感谢您的任何见解。

最后,我找到了CsvHelper源代码,并在其中添加了一些代码。首先,我创建了两个用于忽略和指定名称的属性(我不知道作者为什么决定删除v2中的属性):


属性被删除,因为它们的功能非常有限。映射结构允许更多的可能性

您应该能够直接映射到EF模型。这是映射更好的另一个原因。与属性不同,它允许您映射到无法更改源的类

如果类与CSV文件匹配,则无需执行任何操作

void Main()
{
    using( var stream = new MemoryStream() )
    using( var reader = new StreamReader( stream ) )
    using( var writer = new StreamWriter( stream ) )
    using( var csv = new CsvWriter( writer ) )
    {
        var people = new List<Person>
        {
            new Person
            {
                Name = "Joe User",
                Address = new Address
                {
                    Street = "123 4th Street",
                },
            },
        };

        csv.WriteRecords( people );
        writer.Flush();
        stream.Position = 0;

        reader.ReadToEnd().Dump();
    }
}

public class Person
{
    public string Name { get; set; }

    public Address Address { get; set; }
}

public class Address
{
    public string Street { get; set; }
}
如果要进行更改,可以创建映射文件来解释这些更改。您仍然可以
自动映射
,只需更改所需的内容即可

void Main()
{
    using( var stream = new MemoryStream() )
    using( var reader = new StreamReader( stream ) )
    using( var writer = new StreamWriter( stream ) )
    using( var csv = new CsvWriter( writer ) )
    {
        var people = new List<Person>
        {
            new Person
            {
                Name = "Joe User",
                Address = new Address
                {
                    Street = "123 4th Street",
                },
            },
        };

        csv.Configuration.RegisterClassMap<PersonMap>();
        csv.WriteRecords( people );
        writer.Flush();
        stream.Position = 0;

        reader.ReadToEnd().Dump();
    }
}

public class Person
{
    public string Name { get; set; }

    public Address Address { get; set; }
}

public class Address
{
    public string Street { get; set; }
}

public sealed class PersonMap : CsvClassMap<Person>
{
    public PersonMap()
    {
        AutoMap();
        Map( m => m.Name ).Name( "Full Name" );
    }
}
如果需要,您可以管理引用并拥有完全控制权

void Main()
{
    using( var stream = new MemoryStream() )
    using( var reader = new StreamReader( stream ) )
    using( var writer = new StreamWriter( stream ) )
    using( var csv = new CsvWriter( writer ) )
    {
        var people = new List<Person>
        {
            new Person
            {
                Name = "Joe User",
                Address = new Address
                {
                    Street = "123 4th Street",
                },
            },
        };

        csv.Configuration.RegisterClassMap<PersonMap>();
        csv.WriteRecords( people );
        writer.Flush();
        stream.Position = 0;

        reader.ReadToEnd().Dump();
    }
}

public class Person
{
    public string Name { get; set; }

    public Address Address { get; set; }
}

public class Address
{
    public string Street { get; set; }
}

public sealed class PersonMap : CsvClassMap<Person>
{
    public PersonMap()
    {
        AutoMap();
        Map( m => m.Name ).Name( "Full Name" );
    }
}

老实说,我不认为他会回来。不过,有些人确实想使用它们。我一直在考虑的一个选择是在一些我认为不应该成为主库一部分的其他东西上添加一个扩展插件,对于那些想要使用它的人来说,这些东西可能仍然存在。或者更好的是,其他人应该启动一个CsvHelperContrib项目,并包括类似的内容<代码>属性映射和
数据注释
可以是其中的一部分。

执行SQL语句以获取平面数据表,然后使用您喜爱的Csv工具将该表转换为Csv文件。就编码和维护时间而言,这可能是最快的方法。这可能是一个解决方案,但SQL本身将相当复杂。。。而列名也会有同样的问题。
从表格中选择column1作为[某个漂亮的列名]。
可以将
显示属性看作与列别名一样。我想您可以使用反射来获取
DisplayAttribute
,但是获取属性并将其输出到CSV是一件悬而未决的事情。似乎所有工具都有一些依赖项,这些依赖项很难超出我的答案。最后,我修改了CsvHelper源。我仍然不明白为什么这家伙在新版本中删除了属性。。。无论如何,如果我有足够的时间,这可能是一个很好的拉取请求:)
Name,Street
Joe User,123 4th Street
void Main()
{
    using( var stream = new MemoryStream() )
    using( var reader = new StreamReader( stream ) )
    using( var writer = new StreamWriter( stream ) )
    using( var csv = new CsvWriter( writer ) )
    {
        var people = new List<Person>
        {
            new Person
            {
                Name = "Joe User",
                Address = new Address
                {
                    Street = "123 4th Street",
                },
            },
        };

        csv.Configuration.RegisterClassMap<PersonMap>();
        csv.WriteRecords( people );
        writer.Flush();
        stream.Position = 0;

        reader.ReadToEnd().Dump();
    }
}

public class Person
{
    public string Name { get; set; }

    public Address Address { get; set; }
}

public class Address
{
    public string Street { get; set; }
}

public sealed class PersonMap : CsvClassMap<Person>
{
    public PersonMap()
    {
        AutoMap();
        Map( m => m.Name ).Name( "Full Name" );
    }
}
Full Name,Street
Joe User,123 4th Street