Dynamics CRM 2016 C#:查询不含指定用户的安全角色并避免重复关联
如何在Dynamics 365中查询未分配给指定用户的安全角色?
你的思路完全正确——用左外连接配合过滤条件来模拟SQL里的NOT EXISTS逻辑,这样就能精准找出还没分配给目标用户的安全角色,避免重复关联操作。我帮你把代码调整到位,直接就能用:
首先,先明确目标用户的ID(替换成你实际要操作的用户ID):
Guid targetUserId = new Guid("这里替换成目标用户的ID");
然后修改你的LinkEntity和QueryExpression,核心是在左外连接后,筛选出没有关联到目标用户的角色记录:
LinkEntity userRoles = new LinkEntity { LinkFromEntityName = "role", LinkToEntityName = "systemuserroles", LinkFromAttributeName = "roleid", LinkToAttributeName = "roleid", JoinOperator = JoinOperator.LeftOuter, EntityAlias = "userroles", LinkCriteria = new FilterExpression { FilterOperator = LogicalOperator.And, Conditions = { // 只关联目标用户的角色关联记录 new ConditionExpression("systemuserid", ConditionOperator.Equal, targetUserId) } } }; QueryExpression roleQuery = new QueryExpression { EntityName = "role", ColumnSet = new ColumnSet(true), Criteria = new FilterExpression { FilterOperator = LogicalOperator.And, Conditions = { // 筛选指定名称的角色 new ConditionExpression("name", ConditionOperator.Equal, "RoleName"), // 关键:左外连接后,未分配给目标用户的角色,对应的userroles.systemuserid会是null new ConditionExpression("userroles.systemuserid", ConditionOperator.Null) } }, LinkEntities = { userRoles } };
逻辑解释
这段代码完全对应你想要的SQL语句:
select * from role where role.name = "RoleName" and not exists (select 1 from userRoles where userRoles.roleid = role.roleid and userRoles.user = "xyz")
- 左外连接
systemuserroles表,只匹配目标用户的关联记录; - 主查询筛选出名称符合要求,且没有匹配到关联记录(也就是
userroles.systemuserid为null)的角色,这些就是还没分配给目标用户的角色。
如果需要扩展场景:
- 要筛选多个角色名称,把
name的条件改成ConditionOperator.In,传入角色名数组; - 批量处理多个用户,只需要循环替换
targetUserId即可。
内容的提问来源于stack exchange,提问作者rox
相关产品推荐
相关产品推荐

