如何正确返回对象属性的子集

时间:2018-09-06 14:00:34

标签: c# asp.net-core entity-framework-core

我刚刚开始使用Entity Framework Core在VS2017 ASP.NET Core中使用WebAPI模板,并且我试图找出为特定的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 :(得分:3)

那确实是非常低效的。该方法应如下所示:

[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();
}

顺便说一句,您应该习惯于使用ASP.NET Core中的IActionResult接口。这样,您可以轻松自定义状态代码以及如何返回数据。最好使用以下内容:

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