【问题标题】:Return class as JSON with one extra field in API using Entity Framework使用实体框架将类作为 JSON 返回,API 中有一个额外的字段
【发布时间】:2020-05-29 22:37:02
【问题描述】:

我有一个类Employee,其中包含许多属性,当我想从数据库中读取它并返回它的列表时。我想为它添加一个额外的字段。

目前是这样的:

return await _context.Employees.ToListAsync();

我不想在Employee 之后使用Select 命令,因为据我所知,我必须在Employee 类中列出我的所有属性才能添加额外的属性,如下所示:

return await _context.Employees.Select(em => new 
{
   em.Firstname, // In employee class
   em.Lastname, // In employee class
   ... // Other properties in employee class
   EXTRAFIELD = "Data" // Extra field with any data I want to add to employee
}).ToListAsync();

但在上面的解决方案中,我必须在员工类中列出我的所有字段。

我不想这样做,因为它会将员工放入一个新的对象名称 em:

return await _context.Employees.Select(em => new 
    {
       em,
       EXTRAFIELD = "Data" // Extra field with any data I want to add to employee
    }).ToListAsync();

有没有办法告诉DbContext (_context) 返回Employee 字段并在其中添加“这个新字段”(创建具有与Employee 相同属性的新对象,并额外添加一个)?

【问题讨论】:

  • 所以当前Employee模型中还没有定义额外的字段?
  • 另外,你使用什么 ORM ?是Entity Framework 吗?

标签: c# json object .net-core dbcontext


【解决方案1】:

如何创建并返回一个继承 Employee 属性的自定义对象?并且您可以添加额外的通用字段,例如:

public class CustomEmployee<T> : Employee
{
    public T Data { get; set; }
}

我知道您不想使用 Select 将值从一个对象复制到另一个对象,但我们可以创建如下内容:

public class CustomEmployee<T> : Employee
{

    public CustomEmployee() { } //for cases if you don't want to copy values while creating an instance

    public CustomEmployee(Employee employee)
    {
        foreach (PropertyInfo prop in employee.GetType().GetProperties())
        {
            PropertyInfo prop2 = employee.GetType().GetProperty(prop.Name);
            prop2.SetValue(this, prop.GetValue(employee, null), null);
        }
    }

    public T Data { get; set; }
}

在构造函数中你必须传递一个继承的实例Employee,上面的代码会将值从Employee复制到CustomEmployee。

并像这样使用:

return await _context.Employees.Select(em => new CustomEmployee(em)<string> 
{ 
    Data = "Extra data" 
}).ToListAsync();

【讨论】:

  • 这个工作就像这样改变:if(prop2.CanWrite) prop2.SetValue(this, prop.GetValue(employee, null), null);
猜你喜欢
  • 1970-01-01
  • 2021-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多