#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()`