заменить возвращаемое свойство другим свойством из другой модели, связавшейся по Id - PullRequest
0 голосов
/ 06 апреля 2020

Привет, я не совсем уверен, как это сделать.

У меня есть этот контроллер .NetCore EntityFrame, который получает список символов.

Он работает, когда я просто получаю список символов:

return await _context.Character.ToListAsync();

Возвращает имя, класс, расу, возраст, armorPoints, hitPoints и spiritAnimalId для каждого персонажа в базе данных.

Но теперь вместо простого возвращая только spiritAnimalId, я хочу вернуть настоящее имя животного.

Поэтому я начал писать некоторый код, но быстро потерял способность выяснить, как вернуть имя животного-духа.

Вот что у меня есть:

    // 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;
    }

Так что я заблудился о том, как вернуть список проектов и заменить 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

Спасибо!

1 Ответ

1 голос
/ 06 апреля 2020

Если вы этого еще не сделали, у вас должно быть свойство навигации в вашем классе Character, например:

public SpiritAnimal SpiritAnimal { get; set; }

Затем, когда вы делаете запрос, вы должны включить это отношение, чтобы оно присоединилось в том же запросе:

var characters = await _context.Character.Include(x => x.SpiritAnimal).ToListAsync();

Поскольку вы перебираете символы, вы можете просто получить доступ: character.SpiritAnimal.Name. Если вы хотите только вернуть имя из запроса, вам нужно использовать Select для проецирования в другой класс или анонимный объект:

var characters = await _context.Character
    .Select(x => new
    {
        CharacterName = x.Name,
        SpiritAnimalName = x.SpiritAnimal.Name
    }
    .ToListAsync();

Когда Select выражение использует свойство связанной сущности, вам не нужно явно загружать его; EF достаточно умен, чтобы понять, что для выполнения возврата ему необходимо объединение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...