Использование Linq для выбора результатов в новый экземпляр объекта

#c# #linq #asp.net-core #asp.net-core-webapi #asp.net-core-3.1

#c# #linq #asp.net-core #asp.net-ядро-webapi #asp.net-ядро-3.1 #asp.net-core-webapi

Вопрос:

У меня есть этот запрос linq, который я использую для объединения двух таблиц из _gameContext.

Я пытаюсь использовать select для создания нового объекта типа GameScoresDto.

Но я продолжаю получать сообщение о том, что в GameScoresDto нет конструктора, который принимает 5 аргументов.

Я знаю, что означает ошибка, но я думал, что есть способ использовать select для выбора результатов в новый объект.

Что я мог делать неправильно?

Спасибо!

 [HttpGet("GameScores/{gameId}")]
public async Task<ActionResult<List<GameScoresDto>>> GameScores(Guid gameID)
{
    //var gameScores = await _gameContext.CurrentScores.Where(c => c.GameId == gameID).ToListAsync();

    var gameScores = await (from cs in _gameContext.CurrentScores
                join sm in _gameContext.ScoreMax
                on cs.CurrentScoreId equals sm.CurrentScoreId
                where cs.GameId == gameID
                select 
                    new GameScoresDto ( 
                    cs.ScoreId,
                    cs.GameId,
                    cs.InitialValue,
                    cs.MaximumValue,
                    sm.ActionAmount
                ).ToListAsync();

    return gameScores;
}
    
    
  

Комментарии:

1. Это означает, что вы пытаетесь вызвать GameScoresDto конструктор с 5 аргументами (ScoreId, GameID, initialValue, maximumValue и ActionAmount), но для этого типа не определен конструктор, который принимает 5 аргументы.

2. Трудно сказать, не видя GameScoresDto, но я предполагаю, что у него есть 5 свойств в таком порядке, и вы ожидаете просто передать его, чтобы заполнить эти свойства. Попробуйте использовать фигурные скобки и задать свойства по имени, если это так

Ответ №1:

Это означает, что вы пытаетесь вызвать GameScoresDto конструктор с 5 аргументами (ScoreId, GameID, initialValue, maximumValue и ActionAmount), но для этого типа не определен конструктор, который принимает 5 аргументы.

Чтобы решить эту проблему, либо создайте конструктор, который принимает эти 5 аргументы:

 public class GameScoreDTO
{
    public GameScoreDTO(int scoreId, int gameId, int initVal, int maxVal, int actionAmt)
    {
        // Set properties from constructor arguments here
    }

    // Other class code omitted
}
  

или используйте вместо этого синтаксис инициализатора объекта:

 select new GameScoresDto 
{
    ScoreId = cs.ScoreId,
    GameId = cs.GameId,
    InitialValue = cs.InitialValue,
    MaximumValue = cs.MaximumValue,
    ActionAmount = sm.ActionAmount
}
  

(приведенные выше примеры кода предполагают, что GameScoresDto имеет указанные свойства)

Комментарии:

1. Спасибо! Это решило все проблемы, кроме окончания, где у меня .ToListAsync(); написано GameScoresDto does not contain a definition for ToListAsync .

2. Попробуйте добавить закрытие ) для Select перед вызовом ToListAsync()`