C# Dapper使用第二个ID列而不是第一个ID列映射对象
我的SQL查询返回我用dapper映射的员工信息。SQL从Employee表返回PK以及其他各种列,然后返回每个子对象及其列的PK。但是第一个对象EmployeeModel接收第一个子对象的PK。我尝试重新排序SQL查询,但没有成功。也许我误解了简洁的语法C# Dapper使用第二个ID列而不是第一个ID列映射对象,c#,sql,dapper,C#,Sql,Dapper,我的SQL查询返回我用dapper映射的员工信息。SQL从Employee表返回PK以及其他各种列,然后返回每个子对象及其列的PK。但是第一个对象EmployeeModel接收第一个子对象的PK。我尝试重新排序SQL查询,但没有成功。也许我误解了简洁的语法 var sql = @"SELECT e.id, e.FirstName, e.LastName, e.Nickname, em.id, em.Address
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");
试着这样做:
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");
var sql=@“选择e.id、e.FirstName、e.LastName、e.Nickname、,
em.id作为em_id,em.Address作为em_Address,em.Type作为em_Type,
jt.id作为jt_id,jt.Name作为jt_名称,
p、 id作为p_id,p.编号作为p_编号,p.类型作为p_类型,
d、 id作为d_id,d.Name作为d_Name,
es.id作为es_id,es.Name作为es_Name
来自dbo.e
左加入dbo.em
在em.EmployeeID=e.id上
左连接dbo.JobTitles jt
在e.JobTitleID=jt.id上
左连接电话
在p.EmployeeID=e.id上
左连接dbo.d部门
在e.DepartmentID=d.id上
左JOIN dbo.employees状态
在e.StatusID=es.id”上;
var employees=await connection.QueryAsync
(sql,(e,em,t,p,d)=>
{
e、 EmailList.Add(em);
e、 JobTitle=t;
e、 电话列表。添加(p);
e、 部门=d;
返回e;
},
splitOn:“em_id,jt_id,p_id,d_id”);
您有多个名为id
的列,您希望看到什么?它不是一个读心术的人。为每列指定一个唯一的名称。第一个对象不需要拆分columnAh,这是正确的。我希望它能看到它们并按顺序治疗它们。但是如果不是这样的话,很酷。如果所有Id列的名称都相同,那么只需指定一次。而且:splitOn参数的默认值是“Id”,因此您根本不必指定它。也许我错了,但这里的两个答案似乎相互矛盾。Charlieface说每一列都需要一个唯一的名称,而@Palle Due似乎说它们不必是唯一的。我误解了什么吗?如果你看第一个多重映射测试,你会发现有两个Id列,没有splitOn参数。这很有效,除了我只在Id列上添加了“as”修饰符。
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");