gpt4 book ai didi

c# - 自动映射器性能

转载 作者:太空狗 更新时间:2023-10-29 18:15:54 24 4
gpt4 key购买 nike

我正在使用 Automapper 将我的业务模型映射到 ViewModel。

它可以工作,但是速度很慢。

我有一个包含 6893 个对象和 23 个属性的集合(测试环境,生产环境应该有更多)。

通过循环,它需要 00:02:32.8118534 来映射所有内容。

var objects = // get all items (returns a collection of MyObj)
List<MyViewModel> collection = new List<MyViewModel>();
foreach (MyObj obj in objects)
{
MyViewModel vm = Mapper.Map<MyObj, MyViewModel>(obj);
collection.Add(vm);
}

我试过这样改进它:

var objects = // get all items (returns a collection of MyObj)
IEnumerable<MyViewModel> collection = mapper.Map<IEnumerable<MyObj>, IEnumerable<MyViewModel>>(objects);

00:02:25.4527961 映射所有内容。

所以它并没有那么大的帮助。

我对象的所有属性都不能为 null

这是我配置映射器的方式:

var config = new MapperConfiguration(cfg =>
{
cfg.CreateMap<MyObj, MyViewModel>();
cfg.CreateMap<MyObjOtherObj, MyViewModelOtherObj>();
});
mapper = config.CreateMapper();

我的目标:

public partial class MyObj
{
public MyObj()
{
this.MyObjOtherObj= new HashSet<MyObjOtherObj>();
}

public long a{ get; set; }
public short b{ get; set; }
public string c{ get; set; }
public string d{ get; set; }
public string e{ get; set; }
public string f{ get; set; }
public string g{ get; set; }
public string h{ get; set; }
public string i{ get; set; }
public string j{ get; set; }
public string k{ get; set; }
public string l{ get; set; }
public string m{ get; set; }
public bool n{ get; set; }
public bool o{ get; set; }
public bool p{ get; set; }
public bool q{ get; set; }

public virtual ICollection<MyObjOtherObj> MyObjOtherObj{ get; set; }
public virtual Types Types { get; set; }
}

我的 View 模型:

public class MyViewModel
{
public long a{ get; set; }
public short b{ get; set; }
public string c{ get; set; }
public string d{ get; set; }
public string e{ get; set; }
public string f{ get; set; }
public string g{ get; set; }
public string h{ get; set; }
public string i{ get; set; }
public string j{ get; set; }
public string k{ get; set; }
public string l{ get; set; }
public string m{ get; set; }
public bool n{ get; set; }
public bool o{ get; set; }
public bool p{ get; set; }
public bool q{ get; set; }
public string TypesDescription { get; set; }

public List<MyViewModelOtherObj> MyObjOtherObj { get; set; }
}

我的对象其他对象:

public partial class MyObjOtherObj
{
public long id{ get; set; }
public long MyObjId { get; set; }
public short x{ get; set; }
public string z{ get; set; }

public virtual MyObj MyObj{ get; set; }
public virtual SourceTypes SourceTypes { get; set; }
}

我的 View 模型其他对象:

public class MyViewModelOtherObj
{
public long Id { get; set; }
public long MyObjId { get; set; }
public short x{ get; set; }
public string z{ get; set; }
public string SourceTypesDescription { get; set; }
}

编辑:

来源类型:

public partial class SourceTypes
{
public SourceTypes()
{
this.MyObjOtherObj = new HashSet<MyObjOtherObj>();
}

public short SourceTypeId { get; set; }
public string Description { get; set; }

public virtual ICollection<MyObjOtherObj> MyObjOtherObj { get; set; }
}

类型:

public partial class Types
{
public Types()
{
this.MyObj = new HashSet<MyObj>();
}

public short TypeId { get; set; }
public string Description { get; set; }

public virtual ICollection<MyObj> MyObj{ get; set; }
}

最佳答案

AutoMapper 5.0 版本有显着的性能提升。在我们的基准测试中,使用与您在此处显示的非常相似的类型,我们可以在一秒多一点的时间内映射一百万个项目。在即将推出的 5.1 版本中,这会进一步缩小,我们只比手动映射慢大约 3 倍,这主要是由于手动映射不会进行空检查。

我会升级。

关于c# - 自动映射器性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38619574/

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