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

shi*_*ivu 6 c# automapper entity-framework-core asp.net-core

我们什么时候可以在Asp.Net core应用程序中使用 Mapper.ProjectToover ?Mapper.Map使用ProjectToEntity Framework Core 中的方法,如果我们将其添加到语句的开头,是否会减少我从数据库查询以匹配模型的字段数量 _mapper.ProjectTo?如何减少查询字段数?

而不是使用这个

_mapper.ProjectTo<CompareVarValdto>(_compareRepo.GetCompareDetailsByid(id))
Run Code Online (Sandbox Code Playgroud)

我们可以用这个吗?

_mapper.Map<CompareVarValdto>(result)
Run Code Online (Sandbox Code Playgroud)

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; }
}
Run Code Online (Sandbox Code Playgroud)

控制器获取方法代码片段

[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");
        }
    }
Run Code Online (Sandbox Code Playgroud)

compareRepo数据库法

public IQueryable<CompareDim> GetCompareDetailsByid(int compareId)
{
     return _context.CompareDim.Include("Launguage");
}
Run Code Online (Sandbox Code Playgroud)

qqt*_*qtf 1

参考:automapper LINQ 深入研究

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

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

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

情况似乎并非如此。