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");
我的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");