Dapper 使用第二个 ID 列而不是第一个来映射对象

Dapper maps object using second ID column rather than first

我的SQL查询returns我用dapper映射的员工信息。 SQL returns 来自 Employee table 的 PK,以及其他各种列,然后是每个子对象及其列的 PK。但是第一个对象,EmployeeModel,接收第一个子对象的 PK。我尝试重新排序 SQL 查询但没有成功。也许我误解了 Dapper 语法?

var sql = @"SELECT e.id, e.FirstName, e.LastName, e.Nickname, 
                                    em.id, em.Address, em.Type, 
                                    jt.id, jt.Name, 
                                    p.id, p.Number, p.Type,
                                    d.id, d.Name,
                                    es.id, es.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.Departments d
                          ON e.DepartmentID = d.id
                          LEFT JOIN dbo.EmployeeStatus es  
                          ON e.StatusID = es.id";

                var employees = await connection.QueryAsync<EmployeeModel,
                                                            EmailModel,
                                                            TitleModel,
                                                            PhoneModel,
                                                            DepartmentModel,
                                                            EmployeeModel>
                                                            (sql, (e, em, t, p, d) =>
                {
                    e.EmailList.Add(em);
                    e.JobTitle = t;
                    e.Department = d;
                    e.PhoneList.Add(p);
                    return e;
                },
                splitOn: "id, id, id, id, id");

这是 SQL 结果。例如,第一个 EmployeeModel 以 ID = 2 而不是 9 结束,依此类推。 (用户信息纯属虚构。)

9   Abed    Nadir   Abed    2   Abed.Nadir@Greendale.com    Campus  9   Human Resources Manager 4   555-212-1345    Home    2   Sales   1   Active
9   Abed    Nadir   Abed    2   Abed.Nadir@Greendale.com    Campus  9   Human Resources Manager 13  555-224-7894    Work    2   Sales   1   Active
9   Abed    Nadir   Abed    6   Abed.Nadir@Gmail.com    Personal    9   Human Resources Manager 4   555-212-1345    Home    2   Sales   1   Active
9   Abed    Nadir   Abed    6   Abed.Nadir@Gmail.com    Personal    9   Human Resources Manager 13  555-224-7894    Work    2   Sales   1   Active
9   Abed    Nadir   Abed    7   Abed.Nadir@Yahoo.com    Personal    9   Human Resources Manager 4   555-212-1345    Home    2   Sales   1   Active
9   Abed    Nadir   Abed    7   Abed.Nadir@Yahoo.com    Personal    9   Human Resources Manager 13  555-224-7894    Work    2   Sales   1   Active
10  Jeffrey Winger  Winger  1   Jeff.Winger@Greendale.com   Campus  3   Machinist   5   555-212-4567    Home    3   Manufacturing   4   Suspended
10  Jeffrey Winger  Winger  1   Jeff.Winger@Greendale.com   Campus  3   Machinist   6   555-207-5432    Work    3   Manufacturing   4   Suspended
10  Jeffrey Winger  Winger  1   Jeff.Winger@Greendale.com   Campus  3   Machinist   7   555-207-2145    Cell    3   Manufacturing   4   Suspended
10  Jeffrey Winger  Winger  3   JeffWinger@HHH.com  Work    3   Machinist   5   555-212-4567    Home    3   Manufacturing   4   Suspended
10  Jeffrey Winger  Winger  3   JeffWinger@HHH.com  Work    3   Machinist   6   555-207-5432    Work    3   Manufacturing   4   Suspended
10  Jeffrey Winger  Winger  3   JeffWinger@HHH.com  Work    3   Machinist   7   555-207-2145    Cell    3   Manufacturing   4   Suspended
11  Annie   Edison  Annie   4   Annie.Edison@Greendale.com  Campus  3   Machinist   8   555-225-3754    Cell    5   Receiving   1   Active
13  Pierce  Hawthorn    Pierce  5   Pierce.Hawthorn@Greendale.com   Campus  9   Human Resources Manager 10  555-225-3525    Home    6   Finance 5   Sabbatical
14  Shirley Bennett Shirley 1006    Shirley.Bennett@Greendale.com   Campus  8   Accounts Payable Clerk  14  555-555-6792    Home    8   Equipment   4   Suspended
14  Shirley Bennett Shirley 1007    JesusLovesMe@TrueFaith.com  Personal    8   Accounts Payable Clerk  14  555-555-6792    Home    8   Equipment   4   Suspended
15  Troy    Barnes  Troy    1008    Troy.Barnes@Greendale.com   Campus  9   Human Resources Manager 15  555-229-2855    Cell    2   Sales   2   Former
15  Troy    Barnes  Troy    1009    ButterflyInTheSky@Gmail.com Personal    9   Human Resources Manager 15  555-229-2855    Cell    2   Sales   2   Former

尝试这样的事情:

var sql = @"SELECT e.id, e.FirstName, e.LastName, e.Nickname, 
                                em.id as em_id, em.Address as em_Address, em.Type as em_Type, 
                                jt.id as jt_id, jt.Name as jt_Name, 
                                p.id as p_id, p.Number as p_Number, p.Type as p_Type,
                                d.id as d_id, d.Name as d_Name,
                                es.id as es_id, es.Name as es_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.Departments d
                      ON e.DepartmentID = d.id
                      LEFT JOIN dbo.EmployeeStatus es  
                      ON e.StatusID = es.id";

            var employees = await connection.QueryAsync<EmployeeModel,
                                                        EmailModel,
                                                        TitleModel,
                                                        PhoneModel,
                                                        DepartmentModel,
                                                        EmployeeModel>
                                                        (sql, (e, em, t, p, d) =>
            {
                e.EmailList.Add(em);
                e.JobTitle = t;
                e.PhoneList.Add(p);
                e.Department = d;
                return e;
            },
            splitOn: "em_id, jt_id, p_id, d_id");