c# - 是否可以使用自动映射器将 IDataReader 映射到嵌套 DTO?

标签 c# .net automapper valueinjecter

我希望能够将平面数据读取器映射到嵌套的 DTO 中。运行以下代码,名称为空。我做错了什么还是这根本不可能?

class Program
{
    public class Person
    {
        public int id { get; set; }
        public Name name { get; set; }
    } 

    public class Name
    {
        public string first_name { get; set; }
        public string last_name { get; set; }
    }

    static void Main(string[] args)
    {
        DataTable table = CreateSampleDataTable();
        Mapper.CreateMap<IDataReader, Person>();
        Mapper.CreateMap<IDataReader, Name>();

        var results = Mapper.Map<IDataReader, IList<Person>>(table.CreateDataReader());           
    }

    private static DataTable CreateSampleDataTable()
    {
        var table = new DataTable();

        table.Columns.Add("id", typeof(int));
        table.Columns.Add("first_name", typeof(string));
        table.Columns.Add("last_name", typeof(string));

        table.Rows.Add(100, "Jeff", "Barnes");
        table.Rows.Add(101, "George", "Costanza");
        table.Rows.Add(102, "Stewie", "Griffin");
        table.Rows.Add(103, "Stan", "Marsh");
        table.Rows.Add(104, "Eric", "Cartman");
        return table;
    }
}

最佳答案

可以使用ValueInjecter :

public class DanRyan
{
    [Test]
    public void Main()
    {
        var persons = new List<Person>();
        var table = CreateSampleDataTable();
        var reader = table.CreateDataReader();

        while (reader.Read())
        {
            var p = new Person();

            p.InjectFrom<ReaderInjection>(reader);

            p.name = new Name();
            p.name.InjectFrom<ReaderInjection>(reader);

            persons.Add(p);
        }

        persons.Count.IsEqualTo(5);
        persons[0].id.IsEqualTo(100);
        persons[0].name.first_name.IsEqualTo("Jeff");
        persons[0].name.last_name.IsEqualTo("Barnes");
    }

    public class Person
    {
        public int id { get; set; }
        public Name name { get; set; }
    }

    public class Name
    {
        public string first_name { get; set; }
        public string last_name { get; set; }
    }

    private static DataTable CreateSampleDataTable()
    {
        var table = new DataTable();

        table.Columns.Add("id", typeof(int));
        table.Columns.Add("first_name", typeof(string));
        table.Columns.Add("last_name", typeof(string));

        table.Rows.Add(100, "Jeff", "Barnes");
        table.Rows.Add(101, "George", "Costanza");
        table.Rows.Add(102, "Stewie", "Griffin");
        table.Rows.Add(103, "Stan", "Marsh");
        table.Rows.Add(104, "Eric", "Cartman");
        return table;
    }

    public class ReaderInjection : KnownSourceValueInjection<IDataReader>
    {
        protected override void Inject(IDataReader source, object target)
        {
            for (var i = 0; i < source.FieldCount; i++)
            {
                var activeTarget = target.GetProps().GetByName(source.GetName(i), true);
                if (activeTarget == null) continue;

                var value = source.GetValue(i);
                if (value == DBNull.Value) continue;

                activeTarget.SetValue(target, value);
            }
        }
    }
}

关于c# - 是否可以使用自动映射器将 IDataReader 映射到嵌套 DTO?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3577046/

相关文章:

c# - 在 XML 中写出元音变音字符?

c# - XNA 窗口调整大小调用 LoadContent

.net - AspNetCore 中的 Okta OAuth2 token 验证失败

c# - AutoMapper 在映射两个列表时返回一个空列表

c# - protobuf-net 可以处理自动只读属性吗?

c# - Microsoft.Office.Interop.Word 在代码中打开文档文件时出错

c# - LINQ 在插入中将 "0"转换为 NULL

c# - 从 C# 添加 Windows 功能

c# - AutoMapper:根据枚举的值将类映射到 View 模型

c# - 如何使用 Automapper 在两个枚举之间进行映射?