Dynamics 365中如何比较关联实体的列值?
解决Dynamics 365 QueryExpression关联实体列值比较的问题
原代码的核心错误是:直接将关联实体的列名"entity1.userid"作为比较值传入AddCondition,Dynamics 365会把它当成字符串常量而非列引用,无法实现列与列的比较。以下是正确的实现方式:
正确代码示例
方法一:使用ConditionExpression配置列比较
var query1 = new QueryExpression("entity1"); query1.ColumnSet.AddColumns("userid"); // 添加关联实体链接 var link1 = query1.AddLink("entity2", "entity2id", "entity2Id", JoinOperator.Inner); // 创建列比较条件 var columnCompareCondition = new ConditionExpression("ownerId", ConditionOperator.NotEqual); columnCompareCondition.CompareColumns = true; // 标记为列与列的比较 columnCompareCondition.RightOperand = "entity1.userid"; // 指定要比较的主实体列 link1.LinkCriteria.Conditions.Add(columnCompareCondition);
方法二:使用实体别名+FilterExpression(兼容旧版本)
var query1 = new QueryExpression("entity1"); query1.ColumnSet.AddColumns("userid"); query1.EntityAlias = "e1"; // 给主实体设置别名 // 添加关联实体并设置别名 var link1 = query1.AddLink("entity2", "entity2id", "entity2Id", JoinOperator.Inner); link1.EntityAlias = "e2"; // 创建过滤器并配置列比较 var columnFilter = new FilterExpression(); columnFilter.AddCondition("e2.ownerId", ConditionOperator.NotEqual, "e1.userid"); columnFilter.CompareColumns = true; // 关键:启用列比较模式 link1.LinkCriteria.Filters.Add(columnFilter);
关键注意点
- 必须设置
CompareColumns = true,明确告诉系统这是列与列的比较,而非列与固定值的匹配。 - 如果使用实体别名,主实体和关联实体都需要通过
EntityAlias属性设置别名,后续用"别名.列名"的格式引用列,逻辑更清晰。 - 原代码中
AddCondition的最后一个参数是用于固定值匹配的,不能直接传入列名,这是导致问题的核心原因。
内容的提问来源于stack exchange,提问作者Andrey Bushman
相关产品推荐
相关产品推荐

