选择条件是否仅匹配一个特定值

时间:2019-08-05 06:24:22

标签: c# linq

我有一个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变量,用户还具有“总经理”的角色。但是我想实现的是,如果除“部门经理”以外的任何其他角色相匹配,将没有任何分配。我该如何实现?

1 个答案:

答案 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;
    }
}