Asp.net MVC core中Mapper.ProjectTo和Mapper.Map有什么区别

问题描述 投票:0回答:1

我们什么时候可以在Asp.Net Core应用程序中使用

Mapper.ProjectTo
而不是
Mapper.Map
?在 Entity Framework Core 中使用
ProjectTo
方法,如果我们将其添加到
_mapper.ProjectTo
语句的开头,是否会减少我从数据库查询以匹配模型的字段数量?如何减少查询字段数?

而不是使用这个

_mapper.ProjectTo<CompareVarValdto>(_compareRepo.GetCompareDetailsByid(id))

我们可以用这个吗?

_mapper.Map<CompareVarValdto>(result)

ComapreVarValdto.cs

public class CompareVarValdto
{
    public int CompareVarValId { get; set; }
    public int CURRENT_CATEGORY_ID { get; set; }
    public int Current_LaunguageId { get; set; }
    public int Current_compareDimId { get; set; }
    public string CONTENT { get; set; }
}

控制器获取方法代码片段

[Route("api/[controller]")]
[ApiController]
public class ComapareController : ControllerBase
{
    private readonly ICompare _compareRepo;
    private readonly IMapper _mapper;
    public ComapareController(ICompare compare, IMapper mapper)
    {
        _compareRepo = compare;
        _mapper = mapper;
    }

    [HttpGet("{id:int}")]
    public IActionResult GetComapare(int id)
    {
        try
        {
            return Ok(_mapper.ProjectTo<CompareVarValdto>(_compareRepo.GetCompareDetailsByid(id)));
            //VS
            //var result = _compareRepo.GetCompareDetailsByid(id);
            //return Ok(_mapper.Map<CompareVarValdto>(result));
        }
        catch (Exception ex)
        {
            return StatusCode(StatusCodes.Status500InternalServerError,
                "Error retrieving data from the database");
        }
    }

compareRepo
数据库方法

public IQueryable<CompareDim> GetCompareDetailsByid(int compareId)
{
     return _context.CompareDim.Include("Launguage");
}
c# asp.net-core entity-framework-core automapper
1个回答
1
投票

参考:automapper LINQ 深入研究

我认为这篇文章解释了你的问题。 如果我理解这篇文章是正确的,Mapper.Map 在内存中工作,Project 将创建一个需要由底层查询提供程序解析和理解的表达式树。 我不确定它是否会减少查询字段的数量。我的理解/猜测是,并且我希望人们能纠正我,ProjectTo 更高效,因为查询仅在构建完整的表达式树后执行,并且您使用查询提供程序来执行查询(在 SQL 中)。

在记忆中工作时:“(...)

人们在这里遇到的主要问题是,通常源对象是从数据源填充的某个对象,无论它是 关系或非关系源。这意味着原来的 fetch 提取的信息比我们需要的多得多。

事实似乎并非如此。

© www.soinside.com 2019 - 2024. All rights reserved.