23/4/09

Buscar relaciones N:N en CRM

Una de las funcionalidades añadidas en la versión 4.0 fue la de permitir crear relaciones múltiples entre entidades. Aunque internamente se está creando una tabla intermedia o Intersect Table los Web Services de la SDK no la publican como una entidad más que podamos crear o editar. Para asociar dos entidades de esta relación tendremos que usar el mensaje específico AssociateEntitiesRequest. ¿Y para buscar? Hay que recurrir a dos LinkEntities, igual que en SQL necesitaríamos dos JOIN. Lo cuelgo aquí para cuando se me olvide. Por cierto, creo que en la SDK hay un pequeño error.




// Buscar todos los "B" relacionados con "A"
QueryExpression qe = new QueryExpression();
qe.EntityName = "pre_entidad_b";
qe.ColumnSet = new AllColumns();

// Crear el enlace entre la tabla buscada(B) y la intermedia
LinkEntity le1 = new LinkEntity();
le1.LinkFromEntityName = "pre_entidad_b";
le1.LinkFromAttributeName = "pre_entidad_bid";
le1.LinkToEntityName = "pre_entidad_b_entidad_a";
le1.LinkToAttributeName = "pre_entidad_bid";

// Enlace entre la tabla intermedia y la conocida(A)
LinkEntity le2 = new LinkEntity();
le2.LinkFromEntityName = "pre_entidad_b_entidad_a";
le2.LinkFromAttributeName = "entidad_aid";
le2.LinkToEntityName = "entidad_a";
le2.LinkToAttributeName = "entidad_aid";

// Crear la condición para filtrar por la entidad conocida
ConditionExpression ce = new ConditionExpression();
ce.AttributeName = "entidad_aid";
ce.Operator = ConditionOperator.Equal;
ce.Values = new object[] { entidad_aId };

// Añadir la condición al segundo enlace
le2.LinkCriteria = new FilterExpression();
le2.LinkCriteria.Conditions = new ConditionExpression[] { ce };

// Añadir el segundo enlace al primero
le1.LinkEntities = new LinkEntity[] { le2 };
qe.LinkEntities = new LinkEntity[] { le1 };

// Crear la petición
RetrieveMultipleRequest req = new RetrieveMultipleRequest();
req.Query = qe;
RetrieveMultipleResponse resp = (RetrieveMultipleResponse)crm.Execute(req);
resp.BusinessEntityCollection;

1 comentario:

Anónimo dijo...

Mil gracias por todo senor. Eres un monstruo.