Come prelevare attributi dalle entità poste in join

Come si sa quando bisogna fare query molto complesse...

..il sistema migliore, se non si vogliono utilizzare le viste filtrate, è fetch XML.

Infatti esso è il linguaggio nativo della piattaforma del CRM. Spesso però molti si complicano la vita effettuando più query perché non sanno come prendere gli attibuti dalle entità "linkate", in pratica come recepire i valori degli attributi appartenenti ad un'entità messa in join tramite il costrutto "linkentity".

La cosa è abbastanza semplice: si utilizzano gli alias.

Nel codice seguente l'attributo "customerid" viene prelevato anteponendo l'alias "aa" al suo nome, dichiarando l'alias nel fetch xml in modo molto simile a come si farebbe in una query SQL. Si usa sostanzialmente la "dot notation".

string query="<fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='false'>"
                    + "<entity name='opportunityproduct'>"
                    + "<attribute name='productid' />"
                    + "<attribute name='opportunityproductid' />"
                    + "<attribute name='new_version' />"
                    + "<attribute name='new_vendor' />"
                    + "<attribute name='new_numberofusers' />"
                    + "<attribute name='lineitemnumber' />"
                    + "<order attribute='lineitemnumber' descending='false' />"
                    + "<filter type='and'>"
                    + "<condition attribute='productid' operator='not-null' />"
                    + "<condition attribute='new_salestatus' operator='eq' value='1' />"
                    + "</filter>"
                    + "<link-entity name='opportunity' from='opportunityid' to='opportunityid' alias='aa'>"
                    + "<attribute name='customerid' />"
                    + "<filter type='and'>"
                    + "<condition attribute='opportunityid' operator='eq' uiname='Test' uitype='opportunity' value='" + oppid.ToString() +"' />"
                    + "</filter>"
                    + "</link-entity>"
                    + "</entity>"
                    + "</fetch>";
                   EntityCollection coll=service.RetrieveMultiple(new FetchExpression(query));
                   foreach(Entity e in coll.Entities)
                   {
                       try
                       {
                            newinstalled=new Entity("new_installed");
                            er=(EntityReference)e.Attributes["productid"];
                            newinstalled.Attributes.Add("new_name", er.Name);
                            if(e.Attributes.Contains("new_version"))
                                newinstalled.Attributes.Add("new_version", e.Attributes["new_version"]);
                            if(e.Attributes.Contains("new_numberofusers"))
                                newinstalled.Attributes.Add("new_numberofusers", e.Attributes["new_numberofusers"]);
                            if(e.Attributes.Contains("new_vendor"))
                                newinstalled.Attributes.Add("new_vendor", e.Attributes["new_vendor"]);
                            if (e.Attributes.Contains("aa.customerid"))
                            {
                                a =(AliasedValue)e.Attributes["aa.customerid"];
                                er = (EntityReference)a.Value;
                                if (er.LogicalName == "account")
                                    newinstalled.Attributes.Add("new_installed_account_id", er);
                            }
                            service.Create(newinstalled);
                       }
                       catch (FaultException<OrganizationServiceFault> ex)
                       {
                            trace.Trace("Creation error: " + ex.Detail.Message);
                       }
                       catch (Exception ex)
                       {
                            trace.Trace("Creation error: " + ex.Message);
                       }
                   }

 

Dettagli...