CRM 2016中链接实体筛选器使用求助:关联筛选规则未生效
解决CRM 2016链接实体筛选不生效的问题
我来帮你排查这个问题——在CRM 2016里用链接实体筛选时,最容易踩的坑就是没把链接筛选逻辑配置对,或者误把链接筛选加到了主实体的条件里。咱们先分析可能的原因,再给出修正后的代码:
常见问题点
- 你可能把链接实体的筛选条件错误添加到了主实体的
FilterExpression中,而不是放到链接实体的LinkCriteria里 - 链接实体的关联字段逻辑名写错了,导致产品和PhoneCall的关联关系不匹配
- 状态码的取值不对(CRM里
statecode和statuscode是两个不同的字段,要确认你要筛选的是哪一个)
修正后的完整代码示例
// 初始化查询,替换成你的产品自定义实体逻辑名 QueryExpression productQuery = new QueryExpression("new_product"); // 按需指定要返回的字段,这里用true返回所有字段(生产环境建议按需选择) productQuery.ColumnSet = new ColumnSet(true); // 1. 主实体筛选:产品状态为Active FilterExpression mainFilter = new FilterExpression(LogicalOperator.And); // 注意:替换成你产品实体中"productstatus"对应的字段逻辑名和Active的状态码值 // 比如默认状态字段是statecode,Active对应值1,根据你的自定义实体调整 mainFilter.AddCondition("statecode", ConditionOperator.Equal, 1); productQuery.Criteria = mainFilter; // 2. 添加PhoneCall链接实体 // 替换这里的关联字段逻辑名:第一个是PhoneCall实体中关联产品的字段,第二个是产品实体中关联PhoneCall的字段 LinkEntity linkToPhoneCall = productQuery.AddLink( entityName: "phonecall", fromAttributeName: "new_productid", // PhoneCall中指向产品的字段逻辑名 toAttributeName: "new_phonecallproductid", // 产品中指向PhoneCall的字段逻辑名 joinOperator: JoinOperator.Inner // 用Inner Join只保留有符合条件PhoneCall的产品;要保留所有Active产品用LeftOuter ); // 3. 链接实体的筛选条件:类别为fun,状态不为Open FilterExpression phoneCallFilter = new FilterExpression(LogicalOperator.And); // 替换成PhoneCall中"类别"字段的逻辑名和实际值 phoneCallFilter.AddCondition("category", ConditionOperator.Equal, "fun"); // 替换成PhoneCall中"状态"字段的逻辑名和Open对应的状态码(比如statecode=0是Open) phoneCallFilter.AddCondition("statecode", ConditionOperator.NotEqual, 0); // 关键:把链接筛选条件赋值给LinkEntity的LinkCriteria,而不是主实体的Criteria linkToPhoneCall.LinkCriteria = phoneCallFilter; // 执行查询(service是你的IOrganizationService实例) EntityCollection filteredProducts = service.RetrieveMultiple(productQuery);
关键注意事项
- 链接筛选必须放到
LinkEntity.LinkCriteria:这是最容易犯的错误,如果你把链接条件加到了主实体的Filter里,CRM根本不会把它应用到链接实体上 - 确认关联字段正确性:CRM的实体关系是双向的,要确保
fromAttributeName和toAttributeName对应产品与PhoneCall之间的关联字段逻辑名,别搞反了 - 状态码区分
statecode和statuscode:你说的“状态不为open”通常是statecode(比如PhoneCall的statecode=0是Open,1是Completed),如果是状态原因(比如Open下的细分状态)才用statuscode - JoinOperator选择:
Inner会过滤掉没有匹配PhoneCall的产品;如果需要保留所有Active产品(哪怕没有关联PhoneCall),用LeftOuter,但此时可能需要调整筛选逻辑(比如允许PhoneCall字段为Null)
排查小技巧
- 先单独查询PhoneCall,验证
category=fun且状态!=open的记录是否存在 - 检查产品与PhoneCall的实体关系配置,确认关联字段的逻辑名
- 启用CRM的跟踪日志,查看生成的SQL语句,确认筛选条件是否正确被拼接进去
内容的提问来源于stack exchange,提问作者Damkulul




