将返回的 属性 替换为另一个 属性 来自通过 Id 链接的不同模型
replace a returned property with another property from a different model linking by Id
您好,我不太清楚该怎么做。
我有这个获取字符列表的 .NetCore EntityFrame 控制器。
当我通过这样做简单地获取字符列表时它起作用了:
return await _context.Character.ToListAsync();
这 return 是数据库中每个角色的名称、class、种族、年龄、armorPoints、hitPoints 和 spiritAnimalId。
但是现在,我想要 return 动物的实际名称,而不是简单地 returning spiritAnimalId。
所以我开始写一些代码,但很快就失去了弄清楚如何 return 精神动物的名字的能力。
这是我的:
// GET: api/Characters
[HttpGet]
public async Task<ActionResult<IEnumerable<Character>>> GetCharacters()
{
var characters= await _context.Character.ToListAsync();
foreach(Character c in characters)
{
var a = _context.SpiritAnimal.FindAsync(c.spiritAnimalId);
var name = a.Result.Name;
}
return charcters;
}
所以我不知道如何 return 项目列表并将 spiritAnimalId 替换为它的名称。
新代码:
// GET: api/Characters
[HttpGet]
public async Task<ActionResult<List<Character>>> GetCharacters()
{
var characters = await _context.Character
.Select(x => new
{
x.Id,
x.Name,
x.Race,
x.Class,
x.Age,
SpiritAnimalName = x.SpiritAnimalName.Name
})
.ToListAsync();
return characters;
}
新错误:
Cannot implicitly convert type 'System.Collections.Generic.List<<anonymous type
to 'Microsoft.AspNetCore.Mvc.ActionResult<System.Collections.Generic.List
谢谢!
如果您还没有,您的 Character
class 上应该有一个导航 属性,例如:
public SpiritAnimal SpiritAnimal { get; set; }
然后,当你进行查询时,你应该包括这个关系,所以它被加入到同一个查询中:
var characters = await _context.Character.Include(x => x.SpiritAnimal).ToListAsync();
当您遍历字符时,您可以简单地访问:character.SpiritAnimal.Name
。如果您只想 return 查询中的名称,则需要使用 Select
投影到另一个 class 或匿名对象:
var characters = await _context.Character
.Select(x => new
{
CharacterName = x.Name,
SpiritAnimalName = x.SpiritAnimal.Name
}
.ToListAsync();
当 Select
表达式在相关实体上使用 属性 时,您不需要显式加载它; EF 足够聪明,可以意识到它需要进行连接才能满足 return.
您好,我不太清楚该怎么做。
我有这个获取字符列表的 .NetCore EntityFrame 控制器。
当我通过这样做简单地获取字符列表时它起作用了:
return await _context.Character.ToListAsync();
这 return 是数据库中每个角色的名称、class、种族、年龄、armorPoints、hitPoints 和 spiritAnimalId。
但是现在,我想要 return 动物的实际名称,而不是简单地 returning spiritAnimalId。
所以我开始写一些代码,但很快就失去了弄清楚如何 return 精神动物的名字的能力。
这是我的:
// GET: api/Characters
[HttpGet]
public async Task<ActionResult<IEnumerable<Character>>> GetCharacters()
{
var characters= await _context.Character.ToListAsync();
foreach(Character c in characters)
{
var a = _context.SpiritAnimal.FindAsync(c.spiritAnimalId);
var name = a.Result.Name;
}
return charcters;
}
所以我不知道如何 return 项目列表并将 spiritAnimalId 替换为它的名称。
新代码:
// GET: api/Characters
[HttpGet]
public async Task<ActionResult<List<Character>>> GetCharacters()
{
var characters = await _context.Character
.Select(x => new
{
x.Id,
x.Name,
x.Race,
x.Class,
x.Age,
SpiritAnimalName = x.SpiritAnimalName.Name
})
.ToListAsync();
return characters;
}
新错误:
Cannot implicitly convert type 'System.Collections.Generic.List<<anonymous type
to 'Microsoft.AspNetCore.Mvc.ActionResult<System.Collections.Generic.List
谢谢!
如果您还没有,您的 Character
class 上应该有一个导航 属性,例如:
public SpiritAnimal SpiritAnimal { get; set; }
然后,当你进行查询时,你应该包括这个关系,所以它被加入到同一个查询中:
var characters = await _context.Character.Include(x => x.SpiritAnimal).ToListAsync();
当您遍历字符时,您可以简单地访问:character.SpiritAnimal.Name
。如果您只想 return 查询中的名称,则需要使用 Select
投影到另一个 class 或匿名对象:
var characters = await _context.Character
.Select(x => new
{
CharacterName = x.Name,
SpiritAnimalName = x.SpiritAnimal.Name
}
.ToListAsync();
当 Select
表达式在相关实体上使用 属性 时,您不需要显式加载它; EF 足够聪明,可以意识到它需要进行连接才能满足 return.