MapTo()的返回LINQ相同数据的多个迭代内部(MapTo() inside of LINQ r

2019-09-26 06:53发布

我使用.NET的核心与ASP.NET样板框架。 在我得到了修复一些代码,我们有一个GetAll()本来应该从MSSQL数据库返回行的集合方法。 原代码:

public IEnumerable<GuidelineCategoriesDto> GetAll(bool activeFilter = true)
{
    return _guidelineCategoriesRepo.GetAll().Select(x => x.MapTo(new GuidelineCategoriesDto())).ToList();
}

我当时正在与该方法的问题是,它会返回一个没有被软删除数据库中的最新行。 然而,它会多次返回同一行等于不删除的行该表中的金额。 所以基本上我还是会回到一个IEnumerable包含所有重复。 为了解决这个问题,我改变了这种方法如下。

public IEnumerable<GuidelineCategoriesDto> GetAll(bool activeFilter = true)
{
    // return _guidelineCategoriesRepo.GetAll().Select(x => ObjectMapper.Map<GuidelineCategoriesDto>(x)).ToList();
    return ObjectMapper.Map<IEnumerable<GuidelineCategoriesDto>>(_guidelineCategoriesRepo.GetAll());
}

本(包括注释行)固定我的所有问题,并返回正确的数据。 我的问题是,为什么我提到的第一种方法,因为它做的方式行事。 我不熟悉MapTo方法,因为我已经习惯了使用ObjectMapper ,但是从我发现这件事我现在还不能确定为什么这在当时的确的方式表现。

我DTO具有正确的AutoMap数据的注释和DbSetDbContext ,如果有任何的事项。

Answer 1:

这个...

_guidelineCategoriesRepo.GetAll().Select(x => x.MapTo(new GuidelineCategoriesDto())).ToList();

...是有效的:

var dto = new GuidelineCategoriesDto();
_guidelineCategoriesRepo.GetAll().Select(x => x.MapTo(dto)).ToList();

换句话说,你映射每个实体都相同的DTO。

自从上次实体最后映射的,这意味着从每个实体映射DTO似乎是DTO的副本,从最后的实体映射。 但实际上是出现多次一个DTO。

这会工作:

_guidelineCategoriesRepo.GetAll().Select(x => x.MapTo<GuidelineCategoriesDto>()).ToList();

避免MapTo ; 使用ObjectMapper

从https://aspnetboilerplate.com/Pages/Documents/Object-To-Object-Mapping#mapto-extension-methods :

由于MapTo扩展方法是static ,他们使用AutoMapper的静态实例( Mapper.Instance )。 这是简单而精致的应用程序代码,但由于静态配置,你可以在单元测试的问题,映射器不同的测试之间共享,所有影响对方。



文章来源: MapTo() inside of LINQ returning multiple iterations of same data