c# - 仅包括一个属性,而不是整个数据库行

标签 c# asp.net entity-framework asp.net-core 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; }
}

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/

相关文章:

c# - 为什么我们在扩展方法中使用 "this"?

c# - 关于 telerik radEditor

asp.net - 如何使用css创建彩色全圆 Angular 导航菜单

c# - Web API OData - 使用 ODataModelBuilder 公开 ComplexType

c# - 如何将存储过程添加到 EF .edmx?

c# - 从 ASP.NET WebForms 重定向到 MVC

c# - 带资源文件的 asp.net 核心 (resx)

c# - 尝试在 MVC 中设置下拉菜单

c# - 使用数据访问层为 3 层安排 dotnet 核心应用程序

c# - Entity Framework - 使用外键插入