Search code examples
pluginsdynamics-crmpowerapps-modeldriven

How to put And and OR filter type when RetrieveMultiple query is Fetch Expression


Please advice how to filter CRM/Model Driven App Unified Client Interface View using below same query expression in RetrieveMultiple plugin when input parameter query is of type Fetch Expression:

FilterExpression filter = new FilterExpression(LogicalOperator.Or);

string[] sourceChannel = new string[] { "Central Bank", "AECB" };

FilterExpression filter1 = new FilterExpression(LogicalOperator.And);
filter1.Conditions.Add(new ConditionExpression("sourcechannelidname", ConditionOperator.NotIn, sourceChannel));
filter1.Conditions.Add(new ConditionExpression("casetypecode", ConditionOperator.Equal, 1));

FilterExpression filter2 = new FilterExpression(LogicalOperator.And);
filter2.Conditions.Add(new ConditionExpression("sourcechannelidname", ConditionOperator.In, sourceChannel));
filter2.Conditions.Add(new ConditionExpression("valid", ConditionOperator.Equal, 1));
filter2.Conditions.Add(new ConditionExpression("casetypecode", ConditionOperator.Equal, 1));

FilterExpression filter3 = new FilterExpression(LogicalOperator.And);
filter3.Conditions.Add(new ConditionExpression("sourcechannelidname", ConditionOperator.In, sourceChannel));
filter3.Conditions.Add(new ConditionExpression("valid", ConditionOperator.Equal, 2));
filter3.Conditions.Add(new ConditionExpression("reopeningcount", ConditionOperator.GreaterThan, 0));
filter3.Conditions.Add(new ConditionExpression("casetypecode", ConditionOperator.Equal, 1));

FilterExpression filter4 = new FilterExpression(LogicalOperator.And);
filter4.Conditions.Add(new ConditionExpression("sourcechannelidname", ConditionOperator.In, sourceChannel));
filter4.Conditions.Add(new ConditionExpression("valid", ConditionOperator.Equal, 2));
filter4.Conditions.Add(new ConditionExpression("statecode", ConditionOperator.NotEqual, 0));
filter4.Conditions.Add(new ConditionExpression("casetypecode", ConditionOperator.Equal, 1));

filter.AddFilter(filter1);
filter.AddFilter(filter2);
filter.AddFilter(filter3);
filter.AddFilter(filter4);

qe.Criteria.AddFilter(filter);

I tried below by taking help from Microsoft documentation as described here:

https://learn.microsoft.com/en-us/powerapps/developer/data-platform/org-service/samples/modify-query-preoperation-stage

But I don't have any idea how to put And and OR filter type in below XML Document.

Any help or guidance would be appreciated a lot.

entityElement.Add(
  new XElement("filter",
    new XElement("condition",
      new XAttribute("attribute", "sourcechannelidname"),
      new XAttribute("operator", "not-in"), //not equal
      new XElement("value", new XText("Central Bank")),
      new XElement("value", new XText("AECB"))
    ),
    new XElement("condition",
      new XAttribute("attribute", "casetypecode"),
      new XAttribute("operator", "eq"), //equal
      new XAttribute("value", "1"), //Complaints
    )
  )
);

Solution

  • In FetchXml the expression you're trying to write is (see the type='and'):

    <filter type='and' >
      <condition attribute='sourcechannelidname' operator='not-in' >
        <value>Central Bank</value>
        <value>AECB</value>
      </condition>
      <condition attribute='casetypecode' operator='eq' value='1' >
    </filter>
    

    So I think you just need to specify an XAttribute on the "filter" XElement

    entityElement.Add(
      new XElement("filter",
        new XAttribute("type", "and"),
        new XElement("condition",
          new XAttribute("attribute", "sourcechannelidname"),
          new XAttribute("operator", "not-in"), //not equal
          new XElement("value", new XText("Central Bank")),
          new XElement("value", new XText("AECB"))
        ),
        new XElement("condition",
          new XAttribute("attribute", "casetypecode"),
          new XAttribute("operator", "eq"), //equal
          new XAttribute("value", "1"), //Complaints
        )
      )
    );