- 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