Asp.Net 核心 / Entity Framework 核心 - System.Linq.Enumerable+SelectEnumerableIterator`2[MyClass,System.String]
Asp.Net Core / Entity Framework Core - System.Linq.Enumerable+SelectEnumerableIterator`2[MyClass,System.String]
我正在尝试 return 我的第 3 级深度相关数据的 json 数组,这里的问题是我得到的结果具有正确的 属性 名称但带有不明确的价值内容,我没能找到类似的案例来解决它。从 returned 值消息看来我正在 returning 可查询而不是最终结果,我需要对其进行迭代,我尝试了几种方法来实现它但未能找到对了
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))
);
}
更新:附加调试器显示存储库方法正在 returning 一个包含正确值的 IQueryable,而控制器方法在映射时出错。所以我认为以下行是造成错误结果的原因:
var mappedEntities = _mapper.Map<GroupYearsListDto[]>(GroupYears);
您得到这个 JSON 结果:
[
{
"registeredYear": "System.Linq.Enumerable+SelectEnumerableIterator`2[MyPath.Groups.GroupYear,System.String]"
}
]
因为您正在将 IEnumerable<string>
映射到 string
,正如我在评论中提到的那样。所以基本上你得到的是一样的:
CreateMap<UserGroup, GroupYearsListDto>()
.ForMember(
dest => dest.RegisteredYear,
opt => opt.MapFrom(src =>
{
IEnumerable<string> registeredYears = src.Group.GroupYears.Select(x => x.RegisteredYear);
return registeredYears.ToString();
})
);
而registeredYears.ToString()
是"System.Linq.Enumerable+SelectEnumerableIterator`2[MyPath.Groups.GroupYear,System.String]"
。
我想你会:
- 只有一个 - 所以做这样的事情:
src.Group.GroupYears.Select(x => x.RegisteredYear).Single()
- 有倍数 - 所以做这样的事情:
string.Join(", ", src.Group.GroupYears.Select(x => x.RegisteredYear))
你有很多选择,但你实际上需要 return 一个 string
到那个 属性 否则你只会得到 ToString()
版本的 [=15] =].
更新:
根据您在下面的评论,您可以试试这个:
存储库:
public IQueryable<GroupYear> GetGroupYears(string email, string groupName)
{
return _context
.UserGroups
.Where(x => x.Group.Name == groupName && x.Email == email)
.SelectMany(x => x.Group.GroupYears);
}
控制器:
public async Task<ActionResult<GroupYearsListDto[]>> GetGroupYears(string email, string groupName)
{
var groupYears = _repo.GetGroupYears(email, groupName);
var projection = _mapper.ProjectTo<GroupYearsListDto>(groupYears)
var mappedEntities = await projection.ToArrayAsync();
return Ok(mappedEntities);
}
简介:
CreateMap<GroupYears, GroupYearsListDto>();
我正在尝试 return 我的第 3 级深度相关数据的 json 数组,这里的问题是我得到的结果具有正确的 属性 名称但带有不明确的价值内容,我没能找到类似的案例来解决它。从 returned 值消息看来我正在 returning 可查询而不是最终结果,我需要对其进行迭代,我尝试了几种方法来实现它但未能找到对了
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))
);
}
更新:附加调试器显示存储库方法正在 returning 一个包含正确值的 IQueryable,而控制器方法在映射时出错。所以我认为以下行是造成错误结果的原因:
var mappedEntities = _mapper.Map<GroupYearsListDto[]>(GroupYears);
您得到这个 JSON 结果:
[
{
"registeredYear": "System.Linq.Enumerable+SelectEnumerableIterator`2[MyPath.Groups.GroupYear,System.String]"
}
]
因为您正在将 IEnumerable<string>
映射到 string
,正如我在评论中提到的那样。所以基本上你得到的是一样的:
CreateMap<UserGroup, GroupYearsListDto>()
.ForMember(
dest => dest.RegisteredYear,
opt => opt.MapFrom(src =>
{
IEnumerable<string> registeredYears = src.Group.GroupYears.Select(x => x.RegisteredYear);
return registeredYears.ToString();
})
);
而registeredYears.ToString()
是"System.Linq.Enumerable+SelectEnumerableIterator`2[MyPath.Groups.GroupYear,System.String]"
。
我想你会:
- 只有一个 - 所以做这样的事情:
src.Group.GroupYears.Select(x => x.RegisteredYear).Single()
- 有倍数 - 所以做这样的事情:
string.Join(", ", src.Group.GroupYears.Select(x => x.RegisteredYear))
你有很多选择,但你实际上需要 return 一个 string
到那个 属性 否则你只会得到 ToString()
版本的 [=15] =].
更新:
根据您在下面的评论,您可以试试这个:
存储库:
public IQueryable<GroupYear> GetGroupYears(string email, string groupName)
{
return _context
.UserGroups
.Where(x => x.Group.Name == groupName && x.Email == email)
.SelectMany(x => x.Group.GroupYears);
}
控制器:
public async Task<ActionResult<GroupYearsListDto[]>> GetGroupYears(string email, string groupName)
{
var groupYears = _repo.GetGroupYears(email, groupName);
var projection = _mapper.ProjectTo<GroupYearsListDto>(groupYears)
var mappedEntities = await projection.ToArrayAsync();
return Ok(mappedEntities);
}
简介:
CreateMap<GroupYears, GroupYearsListDto>();