我正在尝试使用AutoMapper的ProjectUsing功能,只通过LINQ表达式选择我需要的列,但似乎表达式本身不会在运行时或通过单元测试调用。
作为测试,我只是将一个固定值放入AlternateId属性,但下面的断言总是失败。对于单个实例(不在可查询列表中)以及在运行时通过Entity Framework 6,这也会失败。
class MapFrom
{
public int Id { get; set; }
}
class MapTo
{
public int AlternateId { get; set; }
}
[TestMethod]
public void Automapper_projectusing_test()
{
AutoMapper
.Mapper
.CreateMap<MapFrom, MapTo>()
.ProjectUsing(src => new MapTo { AlternateId = 88 });
var products = new List<MapFrom>();
products.Add(new MapFrom());
var mapped = products
.AsQueryable() // Just in case ProjectUsing only works with IQueryable.
.Project()
.To<MapTo>()
.ToList();
Assert.AreEqual(88, mapped.Single().AlternateId); // Fails, AlternateId equals 0.
}
使用AutoMapper v3.3.1,NCrunch确认永远不会执行映射表达式代码。
为什么AutoMapper没有执行这个表达式,也许我错过了一个关键步骤?
答案 0 :(得分:1)
根据Jimmy Bogarde的说法,这是按照设计工作的,你需要ConstructUsing。&#39;。看到 https://github.com/AutoMapper/AutoMapper/issues/677#event-289561571
显然,它把我们全部抓了出来,所以我认为这里的文件可以更加清晰。
答案 1 :(得分:0)
我试图做同样的事情并遇到了这个问题,也无法弄明白。我下载了Automapper源代码并查看了相关的测试。
public ProjectEnumTest()
{
Mapper.CreateMap<Customer, CustomerDto>();
Mapper.CreateMap<CustomerType, string>().ProjectUsing(ct => ct.ToString().ToUpper());
}
[Fact]
public void ProjectingEnumToString()
{
var customers = new[] { new Customer() { FirstName = "Bill", LastName = "White", CustomerType = CustomerType.Vip } }.AsQueryable();
var projected = customers.Project().To<CustomerDto>();
projected.ShouldNotBeNull();
Assert.Equal(customers.Single().CustomerType.ToString().ToUpper(), projected.Single().CustomerType);
}
简短的回答是,这似乎只适用于成员级映射而不是第一级映射?用下面的映射替换不起作用。预计值只是具有null属性的CustomerDto对象。
Mapper.CreateMap<Customer, CustomerDto>().ProjectUsing(c => new CustomerDto{FirstName = "Test"});
从此处列出的文章:http://lostechies.com/jimmybogard/2014/12/23/automapper-3-3-feature-projection-conversions/我认为上述功能可能是有意的,但不起作用。要么是这样,要么我们对它的工作原理的理解存在配置问题。