我刚刚开始使用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;
}
这很好,只是效率低下。一定有更好的方法吧?
答案 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);
}