【发布时间】:2020-11-25 17:15:27
【问题描述】:
我正在尝试返回我的 3 级深度相关数据的 json 数组,这里的问题是我得到的结果具有正确的属性名称但值内容不明确,我找不到类似的情况来解决它。从返回的值消息看来,我正在返回一个可查询的而不是最终结果,我需要对其进行迭代,我尝试了几种方法来实现它,但未能找到正确的方法。
json结果:
[
{
"registeredYear": "System.Linq.Enumerable+SelectEnumerableIterator`2[MyPath.Groups.GroupYear,System.String]"
}
]
api 端点
public async Task<ActionResult<IEnumerable<UserGroup>>> GetUserGroupYears(string email, string groupName)
{
var groupYears = await _repo.GetUserGroupYears(email, groupName);
var mappedEntities = _mapper.Map<GroupYearsListDto[]>(groupYears);
return Ok(mappedEntities);
}
存储库方法
public async Task<IEnumerable<UserGroup>> GetUserGroupYears(string email, string groupName)
{
var userGroupYears = _context.UserGroups
.Include(uo => uo.Group.GroupYears)
.ThenInclude( oy => oy.Year)
.Where(uo => uo.Group.Name == groupName && uo.Email == email );
return await userGoupYears.ToArrayAsync();
}
使用的类:
public class UserGroup
{
public string Email { get; set; }
public string UserId { get; set; }
public virtual User User { get; set; }
public string GroupId { get; set; }
public virtual Group Group { get; set; }
}
public class Group
{
public string Name { get; set; }
public virtual ICollection<UserGroup> Users { get; set; }
public virtual ICollection<GroupYear> GroupYears { get; }
}
public class GroupYear {
public string GroupId { get; set; }
public virtual Group Group { get; set; }
public string YearId { get; set; }
public virtual Year Year { get; set; }
public string RegisteredYear { get; set; }
}
数据传输对象和映射:
public class GroupYearsListDto
{
public string RegisteredYear { get; set; }
}
public CoreMappingProfiles()
{
CreateMap<UserGroup, GroupYearsListDto>()
.ForMember(
dest => dest.RegisteredYear,
opt => opt.MapFrom(src => src.Group.GroupYears.Select(x => x.RegisteredYear))
);
}
更新:附加调试器表明存储库方法正在返回一个包含正确值的 IQueryable,并且控制器方法在映射时出错。所以我认为下面这行是造成错误结果的原因:
var mappedEntities = _mapper.Map<GroupYearsListDto[]>(GroupYears);
【问题讨论】:
-
首先,
Select(x => x.RegisteredYear)提供了一个IEnumerable<string>,您将其映射到string- 这不起作用。其次,尝试Task<UserGroup[]> GetUserGroupYears- 无需在那里返回IEnumerable。 -
好的,但是OkObjectResult无法转换为Task
-
您的控制器可以简单地是
public ActionResult<UserGroup[]> GetUserGroupYears。在那里返回Task是没有意义的。 -
在同一个控制器中,我有另一种可以正常工作的方法: public async Task
>> GetUserGroups 我可以删除 IEnumerable 但不能删除 Task,如果我先删除 Task需要使方法同步,然后它会遇到映射问题。 -
我更新了问题,请看一下。
标签: linq asp.net-core entity-framework-core automapper