#c# #sql #json #asp.net-core
Вопрос:
Мой api возвращает следующий json:
{
"requestInfo": [
{
"requestId": 118170,
"firstRead": "1905-06-24T00:00:00",
"requestAnswerSent": "2021-09-09T00:00:00",
"currentMilage": "13131",
"damageOccured": "1753-01-01T00:00:00",
"milageDamageOccured": 0,
"latestService": "1753-01-01T00:00:00",
"latestServiceKm": 0,
"contractID": 00000,
"requestRecieved": "2021-10-08T16:18:58.237",
"requestStatus": "NEW_REQUEST",
"claiminfo": [
{
"claimId": 387498,
"name": "Claim",
"answerSent": "2021-09-09T00:00:00"
},
{
"claimId": 387499,
"name": "Rent Replacement Car",
"answerSent": "2021-09-09T00:00:00"
},
{
"claimId": 387500,
"name": "Other Work",
"answerSent": "2021-09-09T00:00:00"
}
]
}
]
}
И я хотел бы вернуть это, не заключая в скобки. Я не могу использовать ни один из FOR JSON WITHOUT WRAPPER
них, так как я возвращаю список, как вы можете видеть, "claiminfo"
но я все равно хотел бы вернуться, не завернув { }
его .
И снова из-за возвращаемого списка я не могу использовать ничего подобного SingleOrDefault
. Вот код (метод, модели и контроллер)
public class RequestInfo
{
//public int claimId { get; set; } = 0;
public int requestId { get; set; } = 0;
public DateTime firstRead { get; set; } = DateTime.Parse("1753-01-01");
public DateTime requestAnswerSent { get; set; } = DateTime.Parse("2021-09-09");
public string currentMilage { get; set; } = "";
public DateTime damageOccured { get; set; } = DateTime.Parse("1753-01-01");
public int milageDamageOccured { get; set; } = 0;
public DateTime latestService { get; set; } = DateTime.Parse("1753-01-01");
public int latestServiceKm { get; set; } = 0;
public int contractID { get; set; } = 0;
public DateTime requestRecieved { get; set; } = DateTime.Parse("1753-01-01");
public string requestStatus { get; set; } = "";
public IEnumerable<ClaimInfo> claiminfo { get; set; }
}
public class ClaimInfo
{
public int claimId { get; set; } = 0;
public string name { get; set; } = "";
public DateTime answerSent { get; set; } = DateTime.Parse("2021-09-09");
}
public class RequestInformation
{
public IEnumerable<RequestInfo> requestInfo { get; set; }
}
Вот контроллер:
[HttpGet]
public async Task<IActionResult> getRequestInfo([FromQuery] RequestInfo model)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
try
{
var list = await _request.getRequestInfo(model);
return Ok(list);
}
catch (Exception ex)
{
return BadRequest(ex.Message);
}
return Ok();
}
И, наконец, метод:
// request info card
public async Task<RequestInformation> getRequestInfo(RequestInfo model)
{
var parameters = new DynamicParameters();
parameters.Add("@requestId", model.requestId);
var getAllRequest = await _sqlconnection.QueryAsync<RequestInfo>($@"SELECT TOP 1
Request.ID as requestId,
FirstRead as firstRead,
CurrentKilometerreading as currentMilage,
DamageDate as damageOccured, DamageKilometerreading as milageDamageOccured,
LatestServiceDate as latestService, LatestServiceKilometer as latestServiceKm,
ClaimHandlingStatus.Name as requestStatus, Request.CreatedDate as requestRecieved,
Contract.ID as contractID
FROM Request
INNER JOIN RequestCrossClaim ON Request.ID = RequestCrossClaim.RequestID
INNER JOIN Claim ON RequestCrossClaim.ClamID = Claim.ID
INNER JOIN Contract ON Request.ContractID = Contract.ID
INNER JOIN ClaimHandlingStatus ON Request.ClaimHandlingStatusID =
ClaimHandlingStatus.ID
WHERE Request.ID = @requestId", parameters);
var getClaimsForRequet = await _sqlconnection.QueryAsync<ClaimInfo>($@"
SELECT RequestType.Name, AnswerSent, Claim.ID as claimId
FROM Request
INNER JOIN RequestCrossClaim ON Request.ID = RequestCrossClaim.RequestID
INNER JOIN Claim ON RequestCrossClaim.ClamID = Claim.ID
INNER JOIN RequestType ON RequestTypeID = RequestType.ID
WHERE Request.ID = @requestId", parameters);
var claims = getClaimsForRequet;
var request = new RequestInformation()
{
requestInfo = getAllRequest
};
foreach (var r in request.requestInfo)
{
r.claiminfo = claims.OrderBy(s => s.claimId);
}
return request;
}
Благодарен за любую помощь.
Комментарии:
1. Не могли бы вы, пожалуйста, добавить желаемый результат?
2. Похоже, вы хотите вернуть OK(list.RequestInfo) с вашего контроллера, который вернет JSON, начиная со списка, вместо того, чтобы начинать с объекта-оболочки.
Ответ №1:
В getRequestInfo попробуйте вернуть OK(list.RequestInfo) вместо OK(список). Это означает, что извлеките объект RequestInfo из результата (списка).
Комментарии:
1. спасибо, вы отлично поработали!