如何在集合中正确使用 ForMember?
How to use ForMember properly inside a collection?
我有我的来源class作为
public class SourceEmployee
{
public int EmployeeID { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public List<ResidentialAddress> EmployeeResidences { get; set; }
}
住宅地址如下
public class ResidentialAddress
{
public string State { get; set; }
public string City { get; set; }
public int ZipCode { get; set; }
}
目的地 class如下
public class DestinationEmployee
{
public int EmployeeID { get; set; }
public string FullName { get; set; }
public List<ResidentialAddress1> Address { get; set; }
}
public class ResidentialAddress1
{
public string FullAddress { get; set; }
}
如何为 State + City + ZipCode
的 FullAddress 执行 ForMember?
我迷路了
Mapper.CreateMap<SourceEmployee, DestinationEmployee>();
Mapper.CreateMap<SourceEmployee, DestinationEmployee>().
ForMember(f => f.FullName, f => f.MapFrom(a => string.Concat(a.FirstName, " ", a.LastName)))
.ForMember(x => x.EmployeeResidences1, x => x.MapFrom(y => string.Concat(y.EmployeeResidences.m, " ", y.LastName)));
嗯,您可以使用 LINQ 让 AutoMapper 知道如何将 3 个属性映射到一个 属性,您不应该真正使用 Mapper.CreateMap()
,因为它 已弃用 并且 5.0 版将不再支持 - 请改用 Mapper.Initialize()
。
让我们看一下这个例子:
Mapper.Initialize(cfg =>
{
cfg.CreateMap<SourceEmployee, DestinationEmployee>();
cfg.CreateMap<SourceEmployee, DestinationEmployee>()
.ForMember(f => f.FullName, f => f.MapFrom(a => string.Concat(a.FirstName, " ", a.LastName)))
.ForMember(
x => x.Address,
x => x.MapFrom(
y => y.EmployeeResidences.Select(
r => new ResidentialAddress1()
{
FullAddress = String.Concat(
r.State, " ", r.City, " ", r.ZipCode)
}).ToList()));
});
SourceEmployee emp = new SourceEmployee()
{
EmployeeID = 1,
FirstName = "Alex",
LastName = "Green",
EmployeeResidences = new List<ResidentialAddress>()
{
new ResidentialAddress() { State = "abc", City = "def", ZipCode = 110 },
new ResidentialAddress() { State = "foo", City = "qwe", ZipCode = 220 },
new ResidentialAddress() { State = "bar", City = "ert", ZipCode = 330 },
}
};
var sourceEmp = Mapper.Map<SourceEmployee, DestinationEmployee>(emp);
Console.WriteLine(sourceEmp.Address.Count);
Console.WriteLine(sourceEmp.Address[1].FullAddress);
输出:
3
foo qwe 220
您的 ResidentialAddress -> ResidentialAddress1
转换应该有一个单独的地图配置文件。当您的父对象将使用自动映射器进行转换时,所有子对象将使用定义的映射配置文件进行转换:
Mapper.CreateMap<SourceEmployee, DestinationEmployee>()
.ForMember(f => f.FullName, f => f.MapFrom(a => string.Concat(a.FirstName, " ", a.LastName)))
.ForMember(x => x.Address, x => x.MapFrom(y => y.EmployeeResidences)));
Mapper.CreateMap<ResidentialAddress, ResidentialAddress1>
.ForMember(x => x.FullAddress, map=>map.From(from => string.Format("{0} {1} {2}", from.State, from.City, from.ZipCode);
这样,如果在代码中您必须在多个地方将 ResidentialAddress
转换为 ResidentialAddress1
,则无需添加任何代码,只需使用 Mapper.Map<>
.
我还建议您切换到配置文件,而不是内联定义映射器配置:https://github.com/AutoMapper/AutoMapper/wiki/Configuration
我有我的来源class作为
public class SourceEmployee
{
public int EmployeeID { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public List<ResidentialAddress> EmployeeResidences { get; set; }
}
住宅地址如下
public class ResidentialAddress
{
public string State { get; set; }
public string City { get; set; }
public int ZipCode { get; set; }
}
目的地 class如下
public class DestinationEmployee
{
public int EmployeeID { get; set; }
public string FullName { get; set; }
public List<ResidentialAddress1> Address { get; set; }
}
public class ResidentialAddress1
{
public string FullAddress { get; set; }
}
如何为 State + City + ZipCode
的 FullAddress 执行 ForMember?
我迷路了
Mapper.CreateMap<SourceEmployee, DestinationEmployee>();
Mapper.CreateMap<SourceEmployee, DestinationEmployee>().
ForMember(f => f.FullName, f => f.MapFrom(a => string.Concat(a.FirstName, " ", a.LastName)))
.ForMember(x => x.EmployeeResidences1, x => x.MapFrom(y => string.Concat(y.EmployeeResidences.m, " ", y.LastName)));
嗯,您可以使用 LINQ 让 AutoMapper 知道如何将 3 个属性映射到一个 属性,您不应该真正使用 Mapper.CreateMap()
,因为它 已弃用 并且 5.0 版将不再支持 - 请改用 Mapper.Initialize()
。
让我们看一下这个例子:
Mapper.Initialize(cfg =>
{
cfg.CreateMap<SourceEmployee, DestinationEmployee>();
cfg.CreateMap<SourceEmployee, DestinationEmployee>()
.ForMember(f => f.FullName, f => f.MapFrom(a => string.Concat(a.FirstName, " ", a.LastName)))
.ForMember(
x => x.Address,
x => x.MapFrom(
y => y.EmployeeResidences.Select(
r => new ResidentialAddress1()
{
FullAddress = String.Concat(
r.State, " ", r.City, " ", r.ZipCode)
}).ToList()));
});
SourceEmployee emp = new SourceEmployee()
{
EmployeeID = 1,
FirstName = "Alex",
LastName = "Green",
EmployeeResidences = new List<ResidentialAddress>()
{
new ResidentialAddress() { State = "abc", City = "def", ZipCode = 110 },
new ResidentialAddress() { State = "foo", City = "qwe", ZipCode = 220 },
new ResidentialAddress() { State = "bar", City = "ert", ZipCode = 330 },
}
};
var sourceEmp = Mapper.Map<SourceEmployee, DestinationEmployee>(emp);
Console.WriteLine(sourceEmp.Address.Count);
Console.WriteLine(sourceEmp.Address[1].FullAddress);
输出:
3
foo qwe 220
您的 ResidentialAddress -> ResidentialAddress1
转换应该有一个单独的地图配置文件。当您的父对象将使用自动映射器进行转换时,所有子对象将使用定义的映射配置文件进行转换:
Mapper.CreateMap<SourceEmployee, DestinationEmployee>()
.ForMember(f => f.FullName, f => f.MapFrom(a => string.Concat(a.FirstName, " ", a.LastName)))
.ForMember(x => x.Address, x => x.MapFrom(y => y.EmployeeResidences)));
Mapper.CreateMap<ResidentialAddress, ResidentialAddress1>
.ForMember(x => x.FullAddress, map=>map.From(from => string.Format("{0} {1} {2}", from.State, from.City, from.ZipCode);
这样,如果在代码中您必须在多个地方将 ResidentialAddress
转换为 ResidentialAddress1
,则无需添加任何代码,只需使用 Mapper.Map<>
.
我还建议您切换到配置文件,而不是内联定义映射器配置:https://github.com/AutoMapper/AutoMapper/wiki/Configuration