Linq to Entities 方法:Select 和 ToListAsync

Linq to Entities method: Select and ToListAsync

我只想检索查询中的几列。我想使用 entity framework:

来实现这个查询
select FirstName from Employee

但是,我无法同时使用 SelectToListAsync。我收到一个错误,看起来我不能同时使用两者。 还有其他方法吗?

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