Вернуть класс как JSON с одним дополнительным полем в API с использованием Entity Framework - PullRequest
2 голосов
/ 30 мая 2020

У меня есть класс Employee со многими свойствами, и когда я хочу прочитать его из базы данных и вернуть его список. Я хочу добавить к нему дополнительное поле.

В настоящее время это примерно так:

return await _context.Employees.ToListAsync();

Я не хочу использовать команду Select после Employee, потому что насколько я знаю, что мне нужно перечислить все свои свойства в классе 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, с одним дополнительным)?

1 Ответ

1 голос
/ 30 мая 2020

Как насчет создания и возврата настраиваемого объекта, который унаследует свойства Employee? И вы можете добавить дополнительное поле generi c, например:

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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...