当 RetrieveMultiple 查询为 Fetch Expression 时如何放置 And 和 OR 过滤器类型
How to put And and OR filter type when RetrieveMultiple query is Fetch Expression
当输入参数查询的类型为 Fetch Expression 时,请建议如何在 RetrieveMultiple 插件中使用以下相同的查询表达式来过滤 CRM/Model Driven App Unified Client Interface View:
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);
我按照此处所述从 Microsoft 文档获取帮助,尝试了以下操作:
但我不知道如何在下面的 XML 文档中放置 And 和 OR 过滤器类型。
非常感谢任何帮助或指导。
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
)
)
);
在 FetchXml 中,您尝试编写的表达式是(参见 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>
所以我认为您只需要在“过滤器”XElement
上指定一个 XAttribute
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
)
)
);
XrmToolbox 现在可以将 C# 解析为提取表达式。只需使用“查看”菜单并选择“QueryExpression”以打开 window,然后在其中输入(或粘贴)您的有效代码并单击“解析”,它将为您将其转换为 FetchXml .
你没有包括完整的 fetchXml 查询,我不认识字段名称,但我将它复制到 OOTB 事件查询(因为我知道它有一个 casetypecode 字段)并用相同的类型替换了字段名称。我为它们制作了参数,因此您可以轻松地将它们替换为您自己的参数。这是我使用的代码:
// Instantiate QueryExpression query
var query = new QueryExpression("incident");
query.TopCount = 50;
// Add all columns to query.ColumnSet
query.ColumnSet.AllColumns = true;
FilterExpression filter = new FilterExpression(LogicalOperator.Or);
string[] sourceChannel = new string[] { "Central Bank", "AECB" };
var stringColName = "ticketnumber";
var intColName = "timezoneruleversionnumber";
var pickColName = "servicestage";
FilterExpression filter1 = new FilterExpression(LogicalOperator.And);
filter1.Conditions.Add(new ConditionExpression(stringColName, ConditionOperator.NotIn, sourceChannel));
filter1.Conditions.Add(new ConditionExpression("casetypecode", ConditionOperator.Equal, 1));
FilterExpression filter2 = new FilterExpression(LogicalOperator.And);
filter2.Conditions.Add(new ConditionExpression(stringColName, ConditionOperator.In, sourceChannel));
filter2.Conditions.Add(new ConditionExpression(pickColName , ConditionOperator.Equal, 1));
filter2.Conditions.Add(new ConditionExpression("casetypecode", ConditionOperator.Equal, 1));
FilterExpression filter3 = new FilterExpression(LogicalOperator.And);
filter3.Conditions.Add(new ConditionExpression(stringColName, ConditionOperator.In, sourceChannel));
filter3.Conditions.Add(new ConditionExpression(pickColName , ConditionOperator.Equal, 2));
filter3.Conditions.Add(new ConditionExpression(intColName, ConditionOperator.GreaterThan, 0));
filter3.Conditions.Add(new ConditionExpression("casetypecode", ConditionOperator.Equal, 1));
FilterExpression filter4 = new FilterExpression(LogicalOperator.And);
filter4.Conditions.Add(new ConditionExpression(stringColName, ConditionOperator.In, sourceChannel));
filter4.Conditions.Add(new ConditionExpression(pickColName , 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);
query.Criteria.AddFilter(filter);
这是它创建的过滤器:
<filter type="and" >
<filter type="or" >
<filter type="and" >
<condition attribute="ticketnumber" operator="not-in" >
<value>Central Bank</value>
<value>AECB</value>
</condition>
<condition attribute="casetypecode" operator="eq" value="1" />
</filter>
<filter type="and" >
<condition attribute="ticketnumber" operator="in" >
<value>Central Bank</value>
<value>AECB</value>
</condition>
<condition attribute="servicestage" operator="eq" value="1" />
<condition attribute="casetypecode" operator="eq" value="1" />
</filter>
<filter type="and" >
<condition attribute="ticketnumber" operator="in" >
<value>Central Bank</value>
<value>AECB</value>
</condition>
<condition attribute="servicestage" operator="eq" value="2" />
<condition attribute="timezoneruleversionnumber" operator="gt" value="0" />
<condition attribute="casetypecode" operator="eq" value="1" />
</filter>
<filter type="and" >
<condition attribute="ticketnumber" operator="in" >
<value>Central Bank</value>
<value>AECB</value>
</condition>
<condition attribute="servicestage" operator="eq" value="2" />
<condition attribute="statecode" operator="ne" value="0" />
<condition attribute="casetypecode" operator="eq" value="1" />
</filter>
</filter>
</filter>
当输入参数查询的类型为 Fetch Expression 时,请建议如何在 RetrieveMultiple 插件中使用以下相同的查询表达式来过滤 CRM/Model Driven App Unified Client Interface View:
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);
我按照此处所述从 Microsoft 文档获取帮助,尝试了以下操作:
但我不知道如何在下面的 XML 文档中放置 And 和 OR 过滤器类型。
非常感谢任何帮助或指导。
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
)
)
);
在 FetchXml 中,您尝试编写的表达式是(参见 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>
所以我认为您只需要在“过滤器”XElement
XAttribute
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
)
)
);
XrmToolbox 现在可以将 C# 解析为提取表达式。只需使用“查看”菜单并选择“QueryExpression”以打开 window,然后在其中输入(或粘贴)您的有效代码并单击“解析”,它将为您将其转换为 FetchXml . 你没有包括完整的 fetchXml 查询,我不认识字段名称,但我将它复制到 OOTB 事件查询(因为我知道它有一个 casetypecode 字段)并用相同的类型替换了字段名称。我为它们制作了参数,因此您可以轻松地将它们替换为您自己的参数。这是我使用的代码:
// Instantiate QueryExpression query
var query = new QueryExpression("incident");
query.TopCount = 50;
// Add all columns to query.ColumnSet
query.ColumnSet.AllColumns = true;
FilterExpression filter = new FilterExpression(LogicalOperator.Or);
string[] sourceChannel = new string[] { "Central Bank", "AECB" };
var stringColName = "ticketnumber";
var intColName = "timezoneruleversionnumber";
var pickColName = "servicestage";
FilterExpression filter1 = new FilterExpression(LogicalOperator.And);
filter1.Conditions.Add(new ConditionExpression(stringColName, ConditionOperator.NotIn, sourceChannel));
filter1.Conditions.Add(new ConditionExpression("casetypecode", ConditionOperator.Equal, 1));
FilterExpression filter2 = new FilterExpression(LogicalOperator.And);
filter2.Conditions.Add(new ConditionExpression(stringColName, ConditionOperator.In, sourceChannel));
filter2.Conditions.Add(new ConditionExpression(pickColName , ConditionOperator.Equal, 1));
filter2.Conditions.Add(new ConditionExpression("casetypecode", ConditionOperator.Equal, 1));
FilterExpression filter3 = new FilterExpression(LogicalOperator.And);
filter3.Conditions.Add(new ConditionExpression(stringColName, ConditionOperator.In, sourceChannel));
filter3.Conditions.Add(new ConditionExpression(pickColName , ConditionOperator.Equal, 2));
filter3.Conditions.Add(new ConditionExpression(intColName, ConditionOperator.GreaterThan, 0));
filter3.Conditions.Add(new ConditionExpression("casetypecode", ConditionOperator.Equal, 1));
FilterExpression filter4 = new FilterExpression(LogicalOperator.And);
filter4.Conditions.Add(new ConditionExpression(stringColName, ConditionOperator.In, sourceChannel));
filter4.Conditions.Add(new ConditionExpression(pickColName , 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);
query.Criteria.AddFilter(filter);
这是它创建的过滤器:
<filter type="and" >
<filter type="or" >
<filter type="and" >
<condition attribute="ticketnumber" operator="not-in" >
<value>Central Bank</value>
<value>AECB</value>
</condition>
<condition attribute="casetypecode" operator="eq" value="1" />
</filter>
<filter type="and" >
<condition attribute="ticketnumber" operator="in" >
<value>Central Bank</value>
<value>AECB</value>
</condition>
<condition attribute="servicestage" operator="eq" value="1" />
<condition attribute="casetypecode" operator="eq" value="1" />
</filter>
<filter type="and" >
<condition attribute="ticketnumber" operator="in" >
<value>Central Bank</value>
<value>AECB</value>
</condition>
<condition attribute="servicestage" operator="eq" value="2" />
<condition attribute="timezoneruleversionnumber" operator="gt" value="0" />
<condition attribute="casetypecode" operator="eq" value="1" />
</filter>
<filter type="and" >
<condition attribute="ticketnumber" operator="in" >
<value>Central Bank</value>
<value>AECB</value>
</condition>
<condition attribute="servicestage" operator="eq" value="2" />
<condition attribute="statecode" operator="ne" value="0" />
<condition attribute="casetypecode" operator="eq" value="1" />
</filter>
</filter>
</filter>