Modello:
public class Word
{
public int ID { get; set; }
public string Title { get; set; }
public DateTime? WhenCreated { get; set; }
public ApplicationUser Author { get; set; }
[NotMapped]
public string AuthorName
{
get
{
if (Author != null)
{
return Author.UserName;
}
else {
return "";
}
}
}
public List<Definition> Definitions { get; set; }
}
controller:
[HttpGet]
public IEnumerable<Word> Get()
{
return _db.Words.Include(x=>x.Author).ToList();
}
My Controller ora restituisce l'intera classe ApplicationUser
che è una delle proprietà di Word
. Voglio inviare solo una proprietà di ApplicationUser
: UserName
. Come lo posso fare?
Ho aggiunto AuthorName
, che restituisce solo i dati che voglio da ApplicationUser
. Purtroppo devo ancora .Include(x=>x.Author)
per far funzionare questa proprietà. Posso in qualche modo omettere l'inclusione Author
nel processo di serializzazione dei dati (per nasconderlo durante l'invio di dati all'utente)?
So che posso usare il metodo .Select()
, ma mi richiede di digitare tutte le proprietà di cui ho bisogno. Se modifico il mio Modello in futuro, avrò bisogno di aggiornare tutti quelli .Select()
che sarebbe scomodo e perdere tempo.
Come lo risolveresti?
È necessario creare un oggetto Dto e assegnare i valori ad esso e restituire invece Dto.
dto
public class WordDto
{
public string Title { get; set; }
public DateTime? WhenCreated { get; set; }
public string AuthorName { get; set; }
}
Quindi nella tua azione
[HttpGet]
public async Task<IEnumerable<WordDto>> Get()
{
return _db.Words
.Include(x=>x.Author)
.Select(x =>
new WordDto
{
Title = x.Title,
DateTime = x.WhenCreated,
AuthorName = x.Author?.UserName ?? string.Empty
}
)
.ToListAsync();
}