You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:58:48