Как правильно вернуть подмножество свойств объекта - PullRequest
0 голосов
/ 06 сентября 2018

Я только начал играть с шаблоном WebAPI в VS2017 ASP.NET Core, используя Entity Framework Core, и я пытаюсь найти лучший способ вернуть подмножество свойств объекта для конкретного запроса Get.

Я использовал встроенный каркас для первоначального генерирования контроллера, а сгенерированный им метод запроса Get изначально выглядел так:

[HttpGet]
public IEnumerable<Person> GetPeople()
{
    return _context.People;
}

Моя проблема заключалась в том, что Person имеет дочерний класс, который я не хочу включать, когда кто-то звонит на GetPeople().

Поскольку я не хочу возвращать анонимный объект, я вместо этого добавил в контроллер сокращенный класс с именем PersonInfo, который имеет только те свойства, которые я хочу вернуть, например:

public class PersonInfo
{
    public int  id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string AD { get; set; }
}

и затем я обновил GetPeople() метод до этого:

[HttpGet]
public IEnumerable<PersonInfo> GetPeople()
{
    List<PersonInfo> pi = new List<PersonInfo>();
    foreach(var person in _context.People
        .Select(p => new { p.id, p.FirstName, p.LastName, p.AD})
        .ToList())
    {
        PersonInfo newPerson = new PersonInfo();
        newPerson.id = person.id;
        newPerson.FirstName = person.FirstName;
        newPerson.LastName = person.LastName;
        newPerson.AD = person.AD;
        pi.Add(newPerson);
    }
    return pi;
}

Это прекрасно работает, просто ужасно неэффективно. Должен быть лучший способ, верно?

1 Ответ

0 голосов
/ 06 сентября 2018

Это действительно ужасно неэффективно. Метод должен выглядеть следующим образом:

[HttpGet]
public async Task<IEnumerable<PersonInfo>> GetPeople()
{
    return await _context.People
        // select the data you want directly
        .Select(p => new PersonInfo 
        { 
            id = p.id, 
            FirstName = p.FirstName, 
            LastName = p.LastName, 
            AD = p.AD
        })
        // always use the asynchronous version of EF Core extension methods
        .ToListAsync();
}

Кстати, вы должны привыкнуть к использованию интерфейса IActionResult в ASP.NET Core. Это позволяет легко настроить код состояния и способ возврата данных. Гораздо предпочтительнее использовать что-то вроде:

[HttpGet]
public async Task<IActionResult> GetPeople()
{
    var data = await _context.People
        // select the data you want directly
        .Select(p => new PersonInfo 
        { 
            id = p.id, 
            FirstName = p.FirstName, 
            LastName = p.LastName, 
            AD = p.AD
        })
        // always use the asynchronous version of EF Core extension methods
        .ToListAsync();

    return Json(data);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...