- Una ventaja significativa de utilizar FetchXml en nuestras consultas es además el soporte a funciones de agrupación y agregados, por ejemplo 'AVG' o 'SUM'
- En caso de tener la consulta ya construida en QueryExpression, podemos hacer uso del mensaje QueryExpressionToFetchXmlRequest para recuperar la consulta enviada en QueryBase en forma de FetchXml
- En este ejemplo tenemos la siguiente consulta en QueryExpression:
QueryExpression query_exp = new QueryExpression();
query_exp.EntityName = ServiceAppointment.EntityLogicalName;
query_exp.ColumnSet = new ColumnSet(new string[] { "actualstart", "subject" });
ConditionExpression c_owner = new ConditionExpression("ownerid", 
    ConditionOperator.EqualUserId);
ConditionExpression c_state_Open = new ConditionExpression("statecode", 
    ConditionOperator.Equal, (int)ServiceAppointmentState.Open);
ConditionExpression c_state_Scheduled = new ConditionExpression("statecode", 
    ConditionOperator.Equal, (int)ServiceAppointmentState.Scheduled);
FilterExpression f_sa_state = new FilterExpression(LogicalOperator.Or);
f_sa_state.Conditions.AddRange(new ConditionExpression[] 
    { c_state_Open, c_state_Scheduled });
ConditionExpression c_actualend = new ConditionExpression("actualend", 
ConditionOperator.Between, new object[] { new DateTime(2012, 6, 1), 
    new DateTime(2013, 6, 1) });
FilterExpression f_sa = new FilterExpression(LogicalOperator.And);
f_sa.AddCondition(c_actualend);
f_sa.AddFilter(f_sa_state);
ConditionExpression c_state_Active = new ConditionExpression("statecode", 
    ConditionOperator.Equal, (int)AccountState.Active);
FilterExpression f_account = new FilterExpression(LogicalOperator.And);
f_account.AddCondition(c_state_Active);
LinkEntity link_activity_pointer = new LinkEntity();
link_activity_pointer.LinkFromEntityName = ServiceAppointment.EntityLogicalName;
link_activity_pointer.LinkFromAttributeName = "activityid";
link_activity_pointer.LinkToEntityName = ActivityParty.EntityLogicalName;
link_activity_pointer.LinkToAttributeName = "activityid";
LinkEntity link_account = new LinkEntity();
link_account.LinkFromEntityName = ActivityParty.EntityLogicalName;
link_account.LinkFromAttributeName = "partyid";
link_account.LinkToEntityName = Account.EntityLogicalName;
link_account.LinkToAttributeName = "accountid";
link_account.LinkCriteria = f_account;
link_activity_pointer.LinkEntities.Add(link_account);
query_exp.Criteria = f_sa;
query_exp.LinkEntities.Add(link_activity_pointer);
EntityCollection svcApps = CrmSvc.RetrieveMultiple(query_exp);
- Para obtener el equivalente a la consulta en FetchXml añadiremos las siguientes líneas de código al programa:
QueryExpressionToFetchXmlRequest convert_request = new QueryExpressionToFetchXmlRequest();
convert_request.Query = query_exp;
QueryExpressionToFetchXmlResponse convert_response = 
    (QueryExpressionToFetchXmlResponse)CrmSvc.Execute(convert_request);
Console.WriteLine(convert_response.FetchXml);
- El resultado indentado de la cadena devuelta por la respuesta es el siguiente
Desde Innovar Tecnologías esperamos que este documento les sea de ayuda en su desarrollo
 
