我是否必须从 Dapper 循环遍历 IEnumerable return,即使我只有 return 一个对象?

Do I have to loop through an IEnumerable return from Dapper even though I only return a single object?

当我从列表中 select 该员工时,我正在使用 Dapper 检索员工信息。一切都正确映射,然后根据 employee.id 对行进行分组。正是我想要的。但是 Dapper returns 一个 IEnumerable,当我查询多个员工并且必须创建多个对象时,这很有意义;但是当我只归还那个时,它就没有意义了。有解决办法吗,还是我只需要遍历单个项目?这是我的代码:

public async Task<List<EmployeeModel>> GetSelectedEmployee(int selectedEmployeeID)
{
    using (IDbConnection connection = new System.Data.SqlClient.SqlConnection(GlobalConfig.CnnString("WorkDeskDB")))
    {
        var par = new
            {
                SelectedEmployeeID = selectedEmployeeID
            };
                
        var sql = @"SELECT e.id, e.FirstName, e.LastName, e.Nickname, 
                        em.EmployeeID, em.Address, em.Type, 
                        e.JobTitleID, jt.id, jt.Name, 
                        p.EmployeeID, p.Number, p.Type,
                        ect.EmployeeID, ect.NameID, ect.InitialDate, ect.ExpirationDate,
                        ct.id, ct.Name
                          
                    FROM dbo.Employees e 
                    LEFT JOIN dbo.Emails em ON em.EmployeeID = e.id
                    LEFT JOIN dbo.JobTitles jt ON e.JobTitleID = jt.id
                    LEFT JOIN Phones p ON p.EmployeeID = e.id
                    LEFT JOIN dbo.EmployeeCertificationType ect ON ect.EmployeeID = e.id
                    LEFT JOIN dbo.CertificationType ct ON ect.NameID = ct.id
                    WHERE e.id = @SelectedEmployeeID"; 

        var employees = await connection.QueryAsync<EmployeeModel, EmailModel, TitleModel, PhoneModel, CertificationModel, EmployeeModel>(sql, (e, em, t, p, c) =>
            {
                e.EmailList.Add(em);
                e.JobTitle = t;
                e.PhoneList.Add(p);
                e.CertificationList.Add(c);
                return e;
            }, 
            par, splitOn: "EmployeeID, JobTitleID, EmployeeID, EmployeeID");

        var result = employees.GroupBy(e => e.ID).Select(g =>
            {
                var groupedEmployee = g.First();
                groupedEmployee.EmailList = g.Select(e => e.EmailList.Single()).ToList();
                return groupedEmployee;
            });
        return result.ToList();
    }
}

我的建议是将调用 connection.QueryAsync<EmployeeModel> 替换为其他 returns 只有一个元素,如所述 here

您只有一名员工。其他行是因为一名员工可以拥有多个电话、电子邮件和证书。 我建议你这样做:

EmployeeModel employee = null;
await connection.QueryAsync<EmployeeModel, EmailModel, TitleModel, PhoneModel, CertificationModel, EmployeeModel>(sql, (e, em, t, p, c) =>
    {
        if (employee is null)
        {
            employee = e;  
            employee.JobTitle = t;
        } 
        employee.EmailList.Add(em);
        employee.PhoneList.Add(p);
        employee.CertificationList.Add(c);
        return employee;
    }, 
    par, splitOn: "EmployeeID, JobTitleID, EmployeeID, EmployeeID");
// go on using employee, no need for the employees list ...

然后你跳过列表的加力。