型号:
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();
}
我的 Controller 现在返回整个 ApplicationUser
类,它是 Word
的属性之一。我只想发送 ApplicationUser
的一个属性:UserName
。我该怎么做?
我添加了 AuthorName
,它将只返回我想要从 ApplicationUser
获取的数据。不幸的是,我仍然需要 .Include(x=>x.Author)
来使这个属性起作用。我可以在数据序列化过程中以某种方式省略包括 Author
吗(在向用户发送数据时隐藏它)?
我知道我可以使用 .Select()
方法,但它需要我输入我需要的所有属性。如果我将来修改我的模型,我将需要更新所有那些 .Select()
,这会很不方便并且浪费时间。
你会如何解决这个问题?
最佳答案
您需要创建一个 Dto 对象并为其赋值,然后返回 Dto。
Dto
public class WordDto
{
public string Title { get; set; }
public DateTime? WhenCreated { get; set; }
public string AuthorName { get; set; }
}
然后在你的行动中
[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();
}
关于c# - 仅包括一个属性,而不是整个数据库行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40192313/