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类,则