hel*_*o B 5 sql-server query-expressions dynamics-crm-2011
我正在尝试使用Query Expression进行简单的内部联接.我试图用QE转换这个查询,但我总是得到同样的错误.我正在做这个QE:
Entity Role = new Entity();
Role.LogicalName = "role";
Entity SystemUserRoles = new Entity();
SystemUserRoles.LogicalName = "systemuserroles";
QueryExpression query = new QueryExpression() {
Distinct = false, EntityName = Role.LogicalName, ColumnSet = new ColumnSet("name"),
LinkEntities = {
new LinkEntity {
JoinOperator = JoinOperator.Inner, LinkFromAttributeName = "roleid", LinkFromEntityName = Role.LogicalName, LinkToAttributeName = "roleid", LinkToEntityName = SystemUserRoles.LogicalName,
}
},
Criteria = {
Filters = {
new FilterExpression {
FilterOperator = LogicalOperator.And, Conditions = {
new ConditionExpression("systemuserid", ConditionOperator.Equal, "9b1bf31d-ac29-e211-9826-00155d0a0b0f"),
},
},
}
}
};
ret = _service.RetrieveMultiple(query);
Run Code Online (Sandbox Code Playgroud)
得到这个:
SELECT b.Name
FROM Role b
INNER JOIN SystemUserRoles a
ON a.RoleId=b.RoleId
WHERE SystemUserId = '9b1bf31d-ac29-e211-9826-00155d0a0b0f'
Run Code Online (Sandbox Code Playgroud)
但这告诉我实体角色不包含该字段SystemUserId.任何的想法?
Dar*_*ryl 11
您的Condition表达式需要继续使用LinkCriteria对象.实际上,这是您当前查询转换的方式.
SELECT b.Name
FROM Role b
INNER JOIN SystemUserRoles a
ON a.RoleId=b.RoleId
WHERE b.SystemUserId = '9b1bf31d-ac29-e211-9826-00155d0a0b0f'
Run Code Online (Sandbox Code Playgroud)
试试这个查询表达式:
Entity role = new Entity();
role.LogicalName = "role";
Entity systemUserRoles = new Entity();
systemUserRoles.LogicalName = "systemuserroles";
QueryExpression query = new QueryExpression() {
Distinct = false, EntityName = role.LogicalName, ColumnSet = new ColumnSet("name")
};
query.AddLink( systemUserRoles.LogicalName, "roleid", "roleid").
LinkCriteria.AddCondition("systemuserid", ConditionOperator.Equal, "9b1bf31d-ac29-e211-9826-00155d0a0b0f");
ret = _service.RetrieveMultiple(query);
Run Code Online (Sandbox Code Playgroud)
请注意如何将条件添加到链接上的LinkCriteria而不是查询表达式本身?
正如@JamesWierzba所指出的那样,没有理由定义一个实体只是为了使用它的逻辑名称:
QueryExpression query = new QueryExpression() {
Distinct = false, EntityName = "role", ColumnSet = new ColumnSet("name")
};
query.AddLink("systemuserroles", "roleid", "roleid").
LinkCriteria.AddCondition("systemuserid", ConditionOperator.Equal, "9b1bf31d-ac29-e211-9826-00155d0a0b0f");
ret = _service.RetrieveMultiple(query);
Run Code Online (Sandbox Code Playgroud)
如果您使用DLaB.Xrm Nuget Package,您可以更简洁地编写它:
var qe = QueryExpressionFactory.Create("role", "name");
qe.AddLink("systemuserroles", "roleid")
.WhereEqual("systemuserid", "9b1bf31d-ac29-e211-9826-00155d0a0b0f");
ret = _service.RetrieveMultiple(qe);
Run Code Online (Sandbox Code Playgroud)