Después de una larga pausa del blog por motivos laborales, paso por acá un momento a dejar una consulta que puede resultar muy útil cuando, desde código, deseamos consultar una tabla intermedia, de esas que guardan la relación de muchos a muchos entre dos entidades (de ellas hablé en mis posts anteriores).

Aunque igualmente se puede hacer usando FetchXML, por acá dejo la otra opción:  Se crea la expresión, se hace el link a la tabla, y en caso de ser necesario, se aplican los filtros necesarios.

En nuestro caso, vamos a consultar las entidades de tipo “venue” que se relacionan con una entidad “event”, trayendo todos los atributos de venue.  Adicionalmente, agrego el código en caso de que se quieran filtrar los resultados de acuerdo a un texto.

QueryExpression query = new QueryExpression()
{
Distinct = true,
EntityName = “yyy_venue”,
ColumnSet = new ColumnSet(true),
};

//Creates the link to the intermediate table
LinkEntity speakingLink = query.AddLink(“yyy_yyy_event_yyy_venue”, “yyy_venueid”, “yyy_venueid”, JoinOperator.Inner);
speakingLink.EntityAlias = “event”;
speakingLink.LinkCriteria = new FilterExpression()
{
FilterOperator = LogicalOperator.And,
Conditions =
{
new ConditionExpression(“yyy_eventid”, ConditionOperator.Equal, Guid.Parse(<HERE GOES THE GUID OF THE EVENT WE NEED TO FILTER>))
}
};

//Filters the query according to a entered text, by the name column
if (filter != string.Empty)
{
FilterExpression filterExpression = new FilterExpression();
filterExpression.FilterOperator = LogicalOperator.And;
filterExpression.Conditions.Add(new ConditionExpression(“yyy_name”, ConditionOperator.Like, “%” + filter + “%”));
venuesQuery.Criteria = filterExpression;
}

EntityCollection venues = CrmServis.RetrieveMultiple(query);