Cómo manipular listas de marketing dinámicas

Introducción

Las listas de marketing son de dos tipos: estáticas o dinámicas. Las primeras tienen una asociación directa con los elementos que la forman -accounts, contacts o leads-. Las segundas presentan una peculiaridad: almacenan una consulta en formato fetch para que se ejecute en el contexto del momento. En otras palabras, sus elementos son asociados en el momento.

Cómo se consultan

Esta doble naturaleza -estática y dinámica- obliga a considerar el tipo de lista de marketing que con la que estamos trabajando. La consulta de los miembros para una lista la estática es directa, siendo extremadamente fácil:

// Consulta miembros de una marketing list estática.
var qe = new QueryExpression("listmember");
qe.Criteria.AddCondition("listid", ConditionOperator.Equal, listId);

var members = service.RetrieveMultiple(qe);

Ahora bien, ¿cómo obtener los miembros de la dinámica si su query es fetch? También sencillo pese a una conversión: pasando su fecth a una FetchExpression:

// Consulta miembros de una marketing list dynámica.
var list = service.Retrieve("list", listId, new ColumnSet("query"));
var fetch = list.GetAttributeValue<string>("query");
var members = service.RetrieveMultiple(new FetchExpression(fetch));

Aplicando la creatividad

Una vez sabemos diferenciar los tipos de listas, ahora toca manipularla. Cuando se recibe una lista dinámica, uno de sus miembros es el atributo query:

// Obtenido el registro (list), se rescata la consulta fetch.
var fetch = list.GetAttributeValue<string>("query");

Esta consulta vendrá en formato fetch. Para poder manipularla, antes la traducieremos en formato QueryExpression gracias al mensaje FetchXmlToQueryExpressionRequest. La respuesta contendrá un miembro llamado Query con la QueryExpression correspondiente a ese fetch:

// Preparamos la petición donde el objeto fetch es la consulta fetch de tipo string.
var request = new FetchXmlToQueryExpressionRequest
{
    FetchXml = fetch
};

var response = (FetchXmlToQueryExpressionResponse)service.Execute(request);

// Esta variable será la QueryExpression que podremos modificar.
var queryExpressionToModify = response.Query;

Obtenida esta última QuerExpression, sólo será necesario hacer las modificaciones pertinentes para nuestra casuística. Por ejemplo, nunca dejar que salgan contactos inactivos o aplicar un criterio más específico por motivos de negocio. Todo ello de forma fácil y legible.

Una utilidad más a tener en cuenta en nuestros desarrollos si el requisito se complica.