我有一个linq查询,如果有特殊作用,我想在其中选择用户名。但是,我希望在且仅当他/她仅仅个目标特殊角色而不是其他特殊角色(例如总经理和采购经理)时才选择它。
DepartmentManagerName = (from r in efDB.TBL_TABNET_REL_USER_ROLE
where (h.Confirm_By == r.TBL_USER.ID) && r.TBL_TABNET_DEF_ROLE.ID == (int)Enums.UserRank.Manager
select r.TBL_USER.Name + " " + r.TBL_USER.Surname).FirstOrDefault(),
一个用户可以在表中具有多个角色,例如一起成为“部门经理”和“总经理”。这是表TBL_TABNET_DEF_ROLE
中的示例;
ID UserID RoleID
123 40 2
126 40 5
127 36 2
128 42 2
129 49 2
130 55 2
131 59 2
132 61 2
133 76 2
134 77 2
但是当我分配给DepartmentManagerName
变量时,如果用户也具有“总经理”角色,则我不希望分配它。由于“ Department Manager”角色早于数据库表中的“ General Manager”角色的原因,因此where条件为true,并且即使在下一次迭代中,也将用户名分配给DepartmentManagerName
变量,用户还具有“总经理”的角色。但是我想实现的是,如果除“部门经理”以外的任何其他角色相匹配,将没有任何分配。我该如何实现?
答案 0 :(得分:2)
我认为这样可以解决您的问题,它将获得只有一个角色且RoleId == 2的第一个用户的UserId(在我的示例中)。
public static void Main()
{
var table = new List<TBL_USER>
{
new TBL_USER(1, 1, 1),
new TBL_USER(2, 1, 2),
new TBL_USER(3, 2, 1),
new TBL_USER(5, 4, 1),
new TBL_USER(6, 4, 2),
new TBL_USER(7, 5, 1),
new TBL_USER(8, 5, 2),
new TBL_USER(9, 5, 3)
};
var user = table
.GroupBy(tbl => tbl.UserId) // Group the lines with the same UserId
.Where(grp => grp.Any(u => u.RoleId == 1) && grp.All(u => u.RoleId != 2)) // Get the groups that have a RoleId as 1 and not RoleId as 2
.FirstOrDefault().Key; // Get the first group and get the Key (UserId)
}
public class TBL_USER
{
public int Id { get; set; }
public int UserId { get; set; }
public int RoleId { get; set; }
public TBL_USER(int id, int user, int role)
{
Id = id;
UserId = user;
RoleId = role;
}
}