僅包含一個屬性,而不是整個數據庫行

asp.net asp.net-core c# entity-framework entity-framework-core

模型:

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; }
}

控制器:

[HttpGet]
    public IEnumerable<Word> Get()
    {
        return _db.Words.Include(x=>x.Author).ToList();
    }

我的Controller現在返回整個ApplicationUser類,它是Word的屬性之一。我只想發送ApplicationUser一個屬性: UserName 。我怎樣才能做到這一點?

我添加了AuthorNameAuthorName返回我想從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();
}


Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow