将返回的 属性 替换为另一个 属性 来自通过 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.