Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/262.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/8/linq/3.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# 使用LINQ/SQL组合两行数据_C#_Linq_Sql Server 2005 - Fatal编程技术网

C# 使用LINQ/SQL组合两行数据

C# 使用LINQ/SQL组合两行数据,c#,linq,sql-server-2005,C#,Linq,Sql Server 2005,我的查询返回以下两行: UserName ID Designation RoleID shd.1234 3 1 2 shd.1234 3 1 5 我能够使用LINQ在Jqgrid中显示这些结果 但是,我想在一行中显示它,如下所示:(如果RoleID为5,则在同一行的另一列中显示它。) 我当前的查询如下: empDetails = (from u in ObjectContext.USERS

我的查询返回以下两行:

UserName  ID  Designation   RoleID

shd.1234   3        1          2

shd.1234   3        1          5
我能够使用LINQ在Jqgrid中显示这些结果

但是,我想在一行中显示它,如下所示:(如果RoleID为5,则在同一行的另一列中显示它。)

我当前的查询如下:

empDetails = (from u in ObjectContext.USERS
              join ed in ObjectContext.USERS_EMPLOYEE_DETAILS on u.UserID equals ed.UserID
              join r in ObjectContext.ROLES_FOR_USERS on u.UserID equals r.UserID
              join ro in ObjectContext.ROLES on r.RoleID equals ro.RoleID
              where (r.HospitalID == Context.CurrentUser.HIdentity.HospitalID)
              where(r.RoleID!= 4)
              select new Models.AdminModelSettings.EmployeeDetailsForGivenHospital
              {
                  UserName = u.UserName,
                  EmployeeId = ed.ID,
                  EmployeeDesignation = ed.Designation,
                  RoleID = r.RoleID,
                  RoleName = r.RoleID == 1 || r.RoleID == 2 || r.RoleID == 3 ? ro.RoleName : null,
                  AdditionalRole = r.RoleID == 5  ? ro.RoleName : null
              }).ToList();

我想知道如何在SQL/LINQ中实现这一点。

更新:我改进了代码,因此它将在SQL中完成所有工作,而不是返回结果然后执行分组。

这应该能奏效

关键部分是我们按角色ID对行进行排序,然后按ID对行进行分组。它假设您只有一个角色和一个附加角色,即它不会选择附加角色2或附加角色3,等等

var empDetails = from u in ObjectContext.USERS 
                 join ed in ObjectContext.USERS_EMPLOYEE_DETAILS on u.UserID equals ed.UserID 
                 join r in ObjectContext.ROLES_FOR_USERS on u.UserID equals r.UserID 
                 join ro in ObjectContext.ROLES on r.RoleID equals ro.RoleID 
                 where (r.HospitalID == Context.CurrentUser.HIdentity.HospitalID) 
                 where(r.RoleID!= 4) 
                 select new Models.AdminModelSettings.EmployeeDetailsForGivenHospital 
                 { 
                     UserName = u.UserName, 
                     EmployeeId = ed.ID, 
                     EmployeeDesignation = ed.Designation, 
                     RoleID = r.RoleID, 
                     RoleName = r.RoleID == 1 || r.RoleID == 2 || r.RoleID == 3 ? ro.RoleName : null
                 });

var roleIDs = new List<int> { 1, 2, 3 };

//group our results and order the group by the role id
var temp = empDetails.GroupBy(row => row.ID).Select(g => new { First = g.FirstOrDefault(r => roleIDs.Contains(r.RoleID)), Last = g.FirstOrDefault(r => r.RoleID == 5) });

//select the data into the shape that we want
var query = temp.Select(result => new Models.AdminModelSettings.EmployeeDetailsForGivenHospital
{
    UserName = (result.First ?? result.Last).UserName,
    EmployeeId = (result.First ?? result.Last).ID,
    EmployeeDesignation = (result.First ?? result.Last).Designation,
    RoleID = (result.First == null) ? (int?)null : result.First.RoleID,
    AdditionalRoleID = (result.Last == null) ? (int?)null : result.Last.RoleID
});
var empDetails=来自ObjectContext.USERS中的u
在ObjectContext.USERS\u EMPLOYEE\u中加入ed关于u.UserID的详细信息等于ed.UserID
在ObjectContext.ROLES\u中加入r,用于u上的用户。UserID等于r.UserID
在r.RoleID上的ObjectContext.ROLES中加入ro等于ro.RoleID
其中(r.HospitalID==Context.CurrentUser.hideEntity.HospitalID)
其中(r.RoleID!=4)
选择新型号。AdminModelSettings.EmployeeDetailsForGivenHospital
{ 
用户名=u.UserName,
EmployeeId=ed.ID,
员工名称=编辑名称,
RoleID=r.RoleID,
RoleName=r.RoleID==1 | | r.RoleID==2 | | r.RoleID==3?ro.RoleName:null
});
var roleIDs=新列表{1,2,3};
//将结果分组,并按角色id对组进行排序
var temp=empDetails.GroupBy(row=>row.ID);
//将数据选择到我们想要的形状中
var query=temp.Select(结果=>newmodels.AdminModelSettings.EmployeeDetailsForGivenHospital
{
用户名=(result.First??result.Last)。用户名,
EmployeeId=(result.First??result.Last).ID,
EmployeeDesignation=(result.First??result.Last)。名称,
RoleID=(result.First==null)?(int?)null:result.First.RoleID,
AdditionalRoleID=(result.Last==null)?(int?)null:result.Last.RoleID
});

更新:我改进了代码,使其能够在SQL中完成所有工作,而不是返回结果然后执行分组。

这应该能奏效

关键部分是我们按角色ID对行进行排序,然后按ID对行进行分组。它假设您只有一个角色和一个附加角色,即它不会选择附加角色2或附加角色3,等等

var empDetails = from u in ObjectContext.USERS 
                 join ed in ObjectContext.USERS_EMPLOYEE_DETAILS on u.UserID equals ed.UserID 
                 join r in ObjectContext.ROLES_FOR_USERS on u.UserID equals r.UserID 
                 join ro in ObjectContext.ROLES on r.RoleID equals ro.RoleID 
                 where (r.HospitalID == Context.CurrentUser.HIdentity.HospitalID) 
                 where(r.RoleID!= 4) 
                 select new Models.AdminModelSettings.EmployeeDetailsForGivenHospital 
                 { 
                     UserName = u.UserName, 
                     EmployeeId = ed.ID, 
                     EmployeeDesignation = ed.Designation, 
                     RoleID = r.RoleID, 
                     RoleName = r.RoleID == 1 || r.RoleID == 2 || r.RoleID == 3 ? ro.RoleName : null
                 });

var roleIDs = new List<int> { 1, 2, 3 };

//group our results and order the group by the role id
var temp = empDetails.GroupBy(row => row.ID).Select(g => new { First = g.FirstOrDefault(r => roleIDs.Contains(r.RoleID)), Last = g.FirstOrDefault(r => r.RoleID == 5) });

//select the data into the shape that we want
var query = temp.Select(result => new Models.AdminModelSettings.EmployeeDetailsForGivenHospital
{
    UserName = (result.First ?? result.Last).UserName,
    EmployeeId = (result.First ?? result.Last).ID,
    EmployeeDesignation = (result.First ?? result.Last).Designation,
    RoleID = (result.First == null) ? (int?)null : result.First.RoleID,
    AdditionalRoleID = (result.Last == null) ? (int?)null : result.Last.RoleID
});
var empDetails=来自ObjectContext.USERS中的u
在ObjectContext.USERS\u EMPLOYEE\u中加入ed关于u.UserID的详细信息等于ed.UserID
在ObjectContext.ROLES\u中加入r,用于u上的用户。UserID等于r.UserID
在r.RoleID上的ObjectContext.ROLES中加入ro等于ro.RoleID
其中(r.HospitalID==Context.CurrentUser.hideEntity.HospitalID)
其中(r.RoleID!=4)
选择新型号。AdminModelSettings.EmployeeDetailsForGivenHospital
{ 
用户名=u.UserName,
EmployeeId=ed.ID,
员工名称=编辑名称,
RoleID=r.RoleID,
RoleName=r.RoleID==1 | | r.RoleID==2 | | r.RoleID==3?ro.RoleName:null
});
var roleIDs=新列表{1,2,3};
//将结果分组,并按角色id对组进行排序
var temp=empDetails.GroupBy(row=>row.ID);
//将数据选择到我们想要的形状中
var query=temp.Select(结果=>newmodels.AdminModelSettings.EmployeeDetailsForGivenHospital
{
用户名=(result.First??result.Last)。用户名,
EmployeeId=(result.First??result.Last).ID,
EmployeeDesignation=(result.First??result.Last)。名称,
RoleID=(result.First==null)?(int?)null:result.First.RoleID,
AdditionalRoleID=(result.Last==null)?(int?)null:result.Last.RoleID
});

那么,如果第三行RoleID=8怎么办?还有其他专栏吗?它在哪里结束?只有4个ID的1,2,3,5。1,2,3进入第一列,5进入第二列。如果第三行RoleID=8会怎么样?还有其他专栏吗?它在哪里结束?只有4个ID的1,2,3,5。1,2,3进入第一列,5进入第二列。1.我现在返回什么?早些时候是empDetails.AsQueryable();2.如果在查询结束时给出.ToList(),则所有行中的RoleID和AdditionalRoleID的值都相同。如果指定员工只有一个RoleID,则只能为RoleID和AdditionalRoleID提供相同的值。如果更改select以选择模型。AdminModelSettings.EmployeeDetailsForGivenHospital类,您可以返回它们的列表或可查询项或任何您想要的内容。您说过,如果指定员工只有1个RoleID,则RoleID和AdditionalRoleID的值将相同。如果RoleID为5,我希望RoleID为空,并添加RoleID 5;否则,我需要其他RoleID为空,RoleID显示1、2或3。我已更新代码以选择EmployeeDetailsForGivenHospital类。还有其他问题吗?1.我现在返回什么?早些时候是empDetails.AsQueryable();2.如果在查询结束时给出.ToList(),则所有行中的RoleID和AdditionalRoleID的值都相同。如果指定员工只有一个RoleID,则只能为RoleID和AdditionalRoleID提供相同的值。如果更改select以选择模型。AdminModelSettings.EmployeeDetailsForGivenHospital类,则