我们什么时候可以在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");
}
我认为这篇文章解释了你的问题。 如果我理解这篇文章是正确的,Mapper.Map 在内存中工作,Project 将创建一个需要由底层查询提供程序解析和理解的表达式树。 我不确定它是否会减少查询字段的数量。我的理解/猜测是,并且我希望人们能纠正我,ProjectTo 更高效,因为查询仅在构建完整的表达式树后执行,并且您使用查询提供程序来执行查询(在 SQL 中)。
在记忆中工作时:“(...)
人们在这里遇到的主要问题是,通常源对象是从数据源填充的某个对象,无论它是 关系或非关系源。这意味着原来的 fetch 提取的信息比我们需要的多得多。”
事实似乎并非如此。