gpt4 book ai didi

c# - 使用 AutoMapper 合并对象

转载 作者:太空狗 更新时间:2023-10-30 00:30:48 25 4
gpt4 key购买 nike

我正在尝试使用 AutoMapper 合并来自多个对象的数据,但我遇到了几个我似乎无法解决的问题。

我有一个像这样的对象:

public class Parent
{
public string Id { get; set; }
public List<Child> Children { get; set; }
}
public class Child
{
public string Key { get; set; }
public int? Value1 { get; set; }
public int? Value2 { get; set; }
public int? Value3 { get; set; }
public int? Value4 { get; set; }
public int? Value5 { get; set; }
}

很明显,子属性并不都是 int,但其中大部分都可以为 null。

我在我的应用程序的两个不同层中有这些对象,所以我使用 AutoMapper 在它们之间进行转换:

{
Mapper.CreateMap<Parent, ParentDTO>();
Mapper.CreateMap<ParentDTO, Parent>();

Mapper.CreateMap<Child, ChildDTO>();
Mapper.CreateMap<ChildDTO, Child>();
}

转换效果很好,我对它的作用很满意。但是,现在我需要合并多个相同类型的对象。我将拥有一个包含大部分或全部属性的对象的副本,以及另一个只有少数属性的副本,其余为空。我希望将第二个(部分)对象的任何非空属性映射到第一个(已填写)对象中的相应字段。作为对 this answer 的公认答案状态,我也应该能够使用 AutoMapper 来执行此操作,但它没有给出任何明确的示例。

但是,当我去执行操作时,我得到一个与其中任何一个对象相同的对象,而不是像我想要的那样组合。

{
var bigParent = new Parent
{
Id = "14",
Children = new List<Child>
{
new Child
{
Key = "A",
Value1 = 10,
Value2 = 20,
Value3 = 30,
Value4 = 40,
Value5 = 50
}
}
};

var merge = new Parent
{
Id = "14",
Children = new List<Child>
{
new Child
{
Key = "A",
Value1 = null,
Value2 = null,
Value3 = 100,
Value4 = null,
Value5 = null
}
}
};

var res = Mapper.Map(merge, bigParent);
}

我期望 Child 的值为 10、20、100、40 和 50。但是,根据我将合并作为源还是目标放在 Mapper.Map 中,我得到 null、null、100、null、null 或10、20、30、40、50。

有什么方法可以获得我的期望值?我在想 List 是导致问题的原因,因为它不知道如何排列实体(以确定它们是否相同)。如果 是 回答任何问题,我将能够通过查看一个或多个属性是否相同(在本例中为 Key)来确定子记录是否相同。

最佳答案

如果您想忽略 AutoMapper 配置文件中定义的映射中的空值,请使用:

public class MappingProfile : AutoMapper.Profile
{
public MappingProfile()
{
this.CreateMap<Parent, Parent>()
.ForAllMembers(o => o.Condition((source, destination, member) => member != null));
}
}

关于c# - 使用 AutoMapper 合并对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33018728/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com