Я создаю приложение, которое состоит только из API, использующего .net core 2.1.
У меня есть родительский класс (Dad), которому принадлежит только один ребенок (Kid).Я ищу наиболее эффективный способ отформатировать JSON-ответ моего контроллера;для разработчиков, которые будут интегрировать мой API в свои приложения.
public class Dad
{
public long Id{get;set;}
public string Name{get;set;}
public Kid OnlyChild {get;set;}
}
public class Kid
{
public long Id{get;set;}
public string FirstName{get;set;}
public string LastName{get;set;}
public string Useless{get;set;}
}
В настоящее время я делаю что-то подобное в контроллере:
[HttpGet("{id}")]
public async Task<IActionResult> GetDad([FromRoute] long id)
{
dynamic DadResponse = _context.Dads
.Where(o => o.Id == id)
.AsNoTracking()
.Select(p => new
{
Dad = p.Name,
Kid = string.Format("{0} {1}", p.Kid.FirstName, p.Kid.LastName)
}).FirstOrDefault();
return Ok(DadResponse);
}
Преимущество этого подхода заключается в следующем:
- результирующий объект DadResponse имеет формат, который я хочу для моего API.
- результирующий запрос MySQL, сгенерированный EF Core, будет оптимизирован и будет выбран только Dad.Name, Kid.FirstName и Kid.LastName.
Недостатком является то, что если значение Kid равно нулю, оно сгенерирует исключение.
Как лучше всего обойти это;возможно я использую неправильный подход все вместе.Я пытался использовать атрибуты JsonIgnore в своих моделях, но каждый из моих контроллеров мог бы возвращать немного разные свойства (например, GET / Kids будет возвращать всех детей с их идентификатором, тогда как GET / Dads может возвращать только формат, описанный выше).
Обновление: В идеале я бы хотел, чтобы Kid возвращал нулевое значение, если у папы нет Kid, но я не могу сделать что-то вроде этого:
Kid = (Kid == null ? null : string.Format("{0} {1}", p.Kid.FirstName, p.Kid.LastName))
У меня естьпопытался динамически обновить значение после выбора, используя следующее:
dynamic DadResponse = _context.Dads
.Where(o => o.Id == id)
.AsNoTracking()
.Select(p => new
{
Dad = p.Name,
Kid = p.Kid
}).FirstOrDefault();
DadResponse.Kid = (DadResponse.Kid == null ? null : string.Format("{0} {1}", DadResponse.Kid.Firstname, DadResponse.Kid.Lastname);
return Ok(DadResponse);
Но это вызывает другое исключение.