Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Dapper使用第二个ID列而不是第一个ID列映射对象_C#_Sql_Dapper - Fatal编程技术网

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

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

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

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