在Dynamics CRM中,实体间的多对多关系(many-to-many relationship)是通过一个中间表(intersecttable)来建立的。我们知道潜在商机和客户有预设N:N关系(Lead andAccount),那我们怎么通过一个给定的潜在商机而获得它所关联的客户呢?
我所知道的有下面三种方法。
1)直接访问中间表实体
QueryByAttribute query = new QueryByAttribute();
//Late Bound的话,这个实体的SchemaName是accountleads
query.EntityName = AccountLeads.EntityLogicalName;
query.Attributes.Add("leadid");
query.ColumnSet = new ColumnSet();
query.Values.Add(new Guid("A36E5A4C-A53F-E311-A586-005056A800FD"));
EntityCollection accounts = _service.RetrieveMultiple(query);
foreach(Entity en in accounts.Entities)
{
//en["accountid"]通过这个就能获得每一个关联客户的Guid了
}
2)通过使用RelationshipQueryCollection来寻找
Lead lead=_service.Retrieve(Lead.EntityLogicalName,new Guid("A36E5A4C-A53F-E311-A586-005056A800FD"),new ColumnSet()) as Lead
QueryExpression query = new QueryExpression();
query.EntityName = Account.EntityLogicalName;
query.ColumnSet = new ColumnSet();
Relationship relationship =new Relationship();
//这里的SchemaName可以到自定义系统里面是实体间N:N Relationship得到
relationship.SchemaName ="accountleads_association";
RelationshipQueryCollection lead_accounts = new RelationshipQueryCollection();
relatedEntites.Add(relationship,query);
RetrieveRequest request =new RetrieveRequest();
request.RelatedEntitiesQuery= lead_accounts;
request.ColumnSet = new ColumnSet();
request.Target =lead.ToEntityReference();
RetrieveResponse response = _service.Execute(request) as RetrieveResponse;
if(response!=null&&response.Entity.RelatedEntities.Count!=0&&response.Entity.RelatedEntities.Contains(relationship))
EntityCollection accounts = response.Entity.RelatedEntities[relationship];
foreach(Entity en in account.Entities)
{
//这里能直接获得实体
}
3)通过使用Link Entity来拼接
在SDK里面有这个例子。例子里面用QueryExpression的LinkEntities和用FetchXml各示范了一次。请有兴趣的朋友到SDK里面查看,这里不再累述了。
SampleCode\CS\GeneralProgramming\Queries\RetrieveRecordsFromAnIntersectTable.cs
谢谢阅读!
Jake Zhong