AutoMapper ProjectUsing 未被调用
AutoMapper ProjectUsing not being called
我正在尝试通过 LINQ 表达式将 AutoMapper 的 ProjectUsing 功能仅用于 select 我需要的列,但似乎表达式本身不会在 运行 时被调用或通过单元测试。
作为测试,我只是将一个固定值放入 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,NC运行ch 确认从未执行映射表达式代码。
为什么 AutoMapper 不执行这个表达式,也许我错过了一个关键步骤?
我正在尝试做同样的事情并遇到了这个问题,但也无法解决。我下载了 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);
}
简短的回答是这似乎只适用于成员级别的映射,而不适用于第一个 class 级别的映射?用下面的映射替换是行不通的。投影值只是一个具有空属性的 CustomerDto 对象。
Mapper.CreateMap<Customer, CustomerDto>().ProjectUsing(c => new CustomerDto{FirstName = "Test"});
来自此处列出的文章:http://lostechies.com/jimmybogard/2014/12/23/automapper-3-3-feature-projection-conversions/ 我假设上述功能可能是有意的,但不起作用。要么,要么我们对它的工作原理的理解存在配置问题。
根据吉米博加德 'This works as designed, you want ConstructUsing.'。看
https://github.com/AutoMapper/AutoMapper/issues/677#event-289561571
显然它让我们所有人都感到困惑,所以我认为这里的文档可能更清楚。
我正在尝试通过 LINQ 表达式将 AutoMapper 的 ProjectUsing 功能仅用于 select 我需要的列,但似乎表达式本身不会在 运行 时被调用或通过单元测试。
作为测试,我只是将一个固定值放入 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,NC运行ch 确认从未执行映射表达式代码。
为什么 AutoMapper 不执行这个表达式,也许我错过了一个关键步骤?
我正在尝试做同样的事情并遇到了这个问题,但也无法解决。我下载了 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);
}
简短的回答是这似乎只适用于成员级别的映射,而不适用于第一个 class 级别的映射?用下面的映射替换是行不通的。投影值只是一个具有空属性的 CustomerDto 对象。
Mapper.CreateMap<Customer, CustomerDto>().ProjectUsing(c => new CustomerDto{FirstName = "Test"});
来自此处列出的文章:http://lostechies.com/jimmybogard/2014/12/23/automapper-3-3-feature-projection-conversions/ 我假设上述功能可能是有意的,但不起作用。要么,要么我们对它的工作原理的理解存在配置问题。
根据吉米博加德 'This works as designed, you want ConstructUsing.'。看 https://github.com/AutoMapper/AutoMapper/issues/677#event-289561571
显然它让我们所有人都感到困惑,所以我认为这里的文档可能更清楚。