Dynamics crm 2011 如何动态修改queueitem视图的筛选条件

Dynamics crm 2011 如何动态修改queueitem视图的筛选条件,dynamics-crm-2011,dynamics-crm,Dynamics Crm 2011,Dynamics Crm,Simon Hutson在博客中说,每次访问CRM用户界面中的视图时,都会引发RetrieveMultiple请求,从而导致CRM平台执行查询。拦截此请求的插件可以在CRM平台执行查询之前修改查询 我想截取插件中queueitem实体的查看请求并对其进行修改,但问题是PluginRegistration工具中没有针对queueitem实体的RetrieveMultiple消息。如何动态修改queueitem视图的筛选条件 问题在Henk回复后更新: 我已在queueitem实体中创建了个人视图。

Simon Hutson在博客中说,每次访问CRM用户界面中的视图时,都会引发RetrieveMultiple请求,从而导致CRM平台执行查询。拦截此请求的插件可以在CRM平台执行查询之前修改查询

我想截取插件中queueitem实体的查看请求并对其进行修改,但问题是PluginRegistration工具中没有针对queueitem实体的RetrieveMultiple消息。如何动态修改queueitem视图的筛选条件

问题在Henk回复后更新:

我已在queueitem实体中创建了个人视图。该个人视图中的筛选条件之一基于queueitem实体的自定义字段:

custom_field    Equals    10
我希望在视图加载时,用其他一些整数值动态地更改10的值。单击站点地图左侧导航区域中的队列实体,即可加载queueitem实体的视图

正如Henk所建议的,我已经在RetrieveMultiple message上为预验证步骤中的所有实体注册了一个插件。在该插件中,我使用了Henk提供的以下代码:

var query = (QueryExpression) context.InputParameters["Query"];
当我点击站点地图左侧导航区域中的Queue实体时,我的插件为这些实体运行了3次:Queue、userquery和savedquery

这3个实体名称是我在插件中使用query.EntityName属性得到的。 现在的问题是我没有在这里获得queueitem实体,这意味着我的插件没有为queueitem执行。由于此问题,我无法使用以下代码行更新queueitem视图的筛选条件:

query.Criteria.AddCondition("custom_field", ConditionOperator.Equal, 500);

如果我尝试在插件中为上述3个实体中的任何一个运行此代码,即queue、userquery和savedquery,我收到一个错误,指定的字段在Microsoft Dynamics CRM中不存在,这在我看来是合乎逻辑的,因为自定义字段存在于queueitem实体中,而不是这3个实体中的任何一个实体中。

您不必为特定实体注册RetrieveMultiple消息。如果您根本没有指定实体,则向Dynamics CRM发出的任何RetrieveMultiple请求都会触发该插件

您可以在预验证步骤中修改QueryExpression的条件

在下面的基本示例中,将截取对帐户实体的查询。该代码添加了一个条件,强制查询仅返回活动帐户记录。请记住,这不是一个完整的解决方案,因为帐户实体也可以是LinkEntity集合的一部分

var context = (IPluginExecutionContext) serviceProvider.GetService(typeof (IPluginExecutionContext));

var query = (QueryExpression) context.InputParameters["Query"];

if (query.EntityName != "account")
    return;

if (query.Criteria.FilterOperator == LogicalOperator.Or)
{
    FilterExpression childFilter = query.Criteria;
    query.Criteria = new FilterExpression(LogicalOperator.And);
    query.Criteria.AddFilter(childFilter);
    query.Criteria.AddCondition("statecode", ConditionOperator.Equal, 0);
    return;
}

ConditionExpression condition = query.Criteria.Conditions.FirstOrDefault(c => c.AttributeName == "statecode");

if (condition == null)
{
    query.Criteria.AddCondition("statecode", ConditionOperator.Equal, 0);
    return;
}

condition.Operator = ConditionOperator.Equal;
condition.Values.Clear();
condition.Values.Add(0);
return;
您不需要保存QueryExpression或在InputParameters集合中替换它。修改后的查询将被进一步传递到插件执行管道

检索多实体队列项目(&E)

我在为RetrieveMultiple消息注册的插件上运行了一些测试,发现实体queueitem没有触发该事件。因此,虽然上面的代码确实适用于包括自定义实体在内的许多实体,但我们似乎必须考虑一些内置实体的例外情况


我还在执行消息上注册了一个插件,该消息过去是为FetchXml请求触发的,但也不走运。在插件中似乎无法拦截实体queueitem上的查询。

最好不要每次检索都注册插件多个性能问题作为经验法则,谨慎是明智的,但有时您没有更好的选择。当你的插件设计得很好的时候,你就可以最小化所涉及的开销。归根结底,就是要尽早确定手头的插件事件是否需要处理。只要内存处理中不涉及I/O,就不必对性能产生明显影响。嗨,Henk,我在RetrieveMultiple message上注册了插件,主实体文本框设置为空,插件成功执行。在插件代码中,context.InputParameters不为Target保存任何值,而是为Query保存值,这在我看来很好,因为这个插件是在调用视图时执行的。您能建议我如何使用context.InputParameters[Query]截取所需的queueitem实体视图以更改其筛选条件吗?我将扩展上面的答案。谢谢您的代码Henk。但它仍然不能解决我的问题。我已经更新了上面的问题。