Linq to Entities 方法:Select 和 ToListAsync
Linq to Entities method: Select and ToListAsync
我只想检索查询中的几列。我想使用 entity framework:
来实现这个查询
select FirstName from Employee
但是,我无法同时使用 Select 和 ToListAsync。我收到一个错误,看起来我不能同时使用两者。
还有其他方法吗?
[HttpGet]
public async Task<ActionResult<IEnumerable<Employee>>> GetEmployee()
{
return await _context.Employee.Select(s => s.FirstName).ToListAsync();
}
根据您的代码,我认为您需要这样的东西:
[HttpGet]
public async Task<ActionResult> GetEmployee()
{
var employeeNames = await _context.Employee.Select(s => s.FirstName).ToListAsync();
return Ok(employeeNames);
}
Gert 的评论涵盖了错误的原因。这将是由于函数需要一组 Employee 实体实体,但您正试图通过使用 Select(s => s.FirstName)
return 一组员工姓名
如果您的目的是 return 只是员工姓名,则将方法签名更新为:
public async Task<ActionResult<IEnumerable<string>>> GetEmployeeNames()
通常情况下,您需要 return 搜索结果或摘要列表之类的内容。您不一定要 return 关于员工的所有内容(并可能在其上序列化相关数据)只是为了显示员工姓名列表以供 select 来自的用户。尽管如此,如果您想 select 其中之一并请求更多信息或对他们执行操作,仅 return 仅输入员工姓名并没有多大用处。 (更不用说您可以有两个 "Peter" 作为雇员...)
在这些情况下,定义一个简单的视图模型来仅表示前端所需的数据会很有帮助。例如员工姓名和 ID:
[Serializable]
public class EmployeeSummaryViewModel
{
public int EmployeeId { get; set; }
public string Name { get; set; }
}
然后是获取员工的方法:
[HttpGet]
public async Task<ActionResult<IEnumerable<EmployeeSummaryViewModels>>> GetEmployeeSummaries()
{
return await _context.Employee
.Select(s => new EmployeeSummaryViewModel
{
EmployeeId = s.EmployeeId,
Name = s.FirstName + " " + s.LastName
}).ToListAsync();
}
视图模型是一个简单的可序列化 C# class。通过利用 Select
来填充它,EF 可以生成一个非常有效的查询 return 我们想要的字段。这可以包括相关表中的字段,例如角色等,而无需担心预先加载或序列化这些相关表中的所有内容。
在上面的示例中,视图模型包含每个员工的 ID returned,因此如果需要,我们可以将该 ID 传递给未来的调用,例如 selecting 员工以加载完整的查看或执行针对的操作。服务器还格式化名称。或者,您可以 return FirstName 和 LastName 并将格式留给客户端。
因为你的 return 类型是 ActionResult<IEnumerable<Employee>>
。只需使用下面的代码来 return Employee
列表
[HttpGet]
public async Task<ActionResult<IEnumerable<Employee>>> GetEmployee()
{
var result = await _context.Employee
.Select(s => new Employee
{
Name = s.FirstName
}).ToListAsync();
return Ok(result);
}
语法错误。你就这样改:
[HttpGet]
public async Task<ActionResult<IEnumerable<string>>> GetEmployee()
{
return await _context.Employee.Select(s => s.FirstName).ToListAsync();
}
或
[HttpGet]
public async Task<IActionResult> GetEmployee()
{
return Ok(await _context.Employee.Select(s => s.FirstName).ToListAsync());
}
我只想检索查询中的几列。我想使用 entity framework:
来实现这个查询select FirstName from Employee
但是,我无法同时使用 Select 和 ToListAsync。我收到一个错误,看起来我不能同时使用两者。 还有其他方法吗?
[HttpGet]
public async Task<ActionResult<IEnumerable<Employee>>> GetEmployee()
{
return await _context.Employee.Select(s => s.FirstName).ToListAsync();
}
根据您的代码,我认为您需要这样的东西:
[HttpGet]
public async Task<ActionResult> GetEmployee()
{
var employeeNames = await _context.Employee.Select(s => s.FirstName).ToListAsync();
return Ok(employeeNames);
}
Gert 的评论涵盖了错误的原因。这将是由于函数需要一组 Employee 实体实体,但您正试图通过使用 Select(s => s.FirstName)
如果您的目的是 return 只是员工姓名,则将方法签名更新为:
public async Task<ActionResult<IEnumerable<string>>> GetEmployeeNames()
通常情况下,您需要 return 搜索结果或摘要列表之类的内容。您不一定要 return 关于员工的所有内容(并可能在其上序列化相关数据)只是为了显示员工姓名列表以供 select 来自的用户。尽管如此,如果您想 select 其中之一并请求更多信息或对他们执行操作,仅 return 仅输入员工姓名并没有多大用处。 (更不用说您可以有两个 "Peter" 作为雇员...)
在这些情况下,定义一个简单的视图模型来仅表示前端所需的数据会很有帮助。例如员工姓名和 ID:
[Serializable]
public class EmployeeSummaryViewModel
{
public int EmployeeId { get; set; }
public string Name { get; set; }
}
然后是获取员工的方法:
[HttpGet]
public async Task<ActionResult<IEnumerable<EmployeeSummaryViewModels>>> GetEmployeeSummaries()
{
return await _context.Employee
.Select(s => new EmployeeSummaryViewModel
{
EmployeeId = s.EmployeeId,
Name = s.FirstName + " " + s.LastName
}).ToListAsync();
}
视图模型是一个简单的可序列化 C# class。通过利用 Select
来填充它,EF 可以生成一个非常有效的查询 return 我们想要的字段。这可以包括相关表中的字段,例如角色等,而无需担心预先加载或序列化这些相关表中的所有内容。
在上面的示例中,视图模型包含每个员工的 ID returned,因此如果需要,我们可以将该 ID 传递给未来的调用,例如 selecting 员工以加载完整的查看或执行针对的操作。服务器还格式化名称。或者,您可以 return FirstName 和 LastName 并将格式留给客户端。
因为你的 return 类型是 ActionResult<IEnumerable<Employee>>
。只需使用下面的代码来 return Employee
[HttpGet]
public async Task<ActionResult<IEnumerable<Employee>>> GetEmployee()
{
var result = await _context.Employee
.Select(s => new Employee
{
Name = s.FirstName
}).ToListAsync();
return Ok(result);
}
语法错误。你就这样改:
[HttpGet]
public async Task<ActionResult<IEnumerable<string>>> GetEmployee()
{
return await _context.Employee.Select(s => s.FirstName).ToListAsync();
}
或
[HttpGet]
public async Task<IActionResult> GetEmployee()
{
return Ok(await _context.Employee.Select(s => s.FirstName).ToListAsync());
}