• Dynamics 365 通过插件中的retrievemultiple消息来过滤产品视图


    本篇中要讲的是对产品视图基于某个条件进行过滤显示,而手段就是通过插件中的retrievemultiple消息,可能很多人都写过对它都不陌生。

    先来看张插件注册的截图,插件的message是retrievemultiple,对应的实体我这里用的是product(为什么用它是因为它特殊,因为它特殊才有了本篇博文),事件是pre-operation(这个很好理解,在展现数据之前就要过滤好,一定是pre中的操作了)

     

    以前写的代码是这样的,判断InputParameters是不是query,然后再判断query的实体是不是产品,再进行逻辑处理
     

    if (context.InputParameters.Contains("Query") && context.InputParameters["Query"] is QueryExpression)
                    {
                        QueryExpression query = (QueryExpression)context.InputParameters["Query"];
                        
                        if (query.EntityName == "product")
                        {
                            //逻辑处理
                        }
                    }
    

        但在365online(2016on-premises也是同样的问题)中死活不行,然后断点调了下发现query.EntityName中居然没有product了,调试下来发现取到的都是下面这些鬼

        很奇怪,product去哪了,不用QueryExpression筛数据那用什么筛啊,咱们把问题往前推到第一个if,看下面这张截图,你会发现尼玛变FetchExpression了而不是 QueryExpression,所以第一个if都没进怎么可能进第二个if呢

    我尝试的实体不多,目前发现的产品、客户、联系人都是这种情况,自定义的实体用QueryExpression都ok的,一开始猜测是不是系统实体都改FetchExpression筛选了,但尝试了报价单的视图用QueryExpression过滤是可以的,有时间得好好查查资料看看什么个情况,如果有人了解其中缘由的也欢迎分享。

    下面奉上FetchExpression的代码,这里用到了FetchExpression和QueryExpression之间的互相转化
     

     if (context.InputParameters["Query"] is FetchExpression)
                    {
                        FetchExpression fetch = (FetchExpression)context.InputParameters["Query"];
                        var conversionRequest = new FetchXmlToQueryExpressionRequest
                        {
                            FetchXml = fetch.Query
                        };
                        var conversionResponse =
                            (FetchXmlToQueryExpressionResponse)service.Execute(conversionRequest);
     
                        // Use the newly converted query expression to make a retrieve multiple
                        // request to Microsoft Dynamics CRM.
                        query = conversionResponse.Query;
                        if (query.EntityName == "product" && context.Depth == 1)
                        {
                            //逻辑
                        }
                        // Convert the query expression to FetchXML.
                        var converRequest = new QueryExpressionToFetchXmlRequest
                        {
                            Query = query
                        };
                        var converResponse =
                            (QueryExpressionToFetchXmlResponse)service.Execute(converRequest);
     
                        // Use the converted query to make a retrieve multiple request to Microsoft Dynamics CRM.
                        String fetchXml = converResponse.FetchXml;
                        fetch.Query = fetchXml;
                    }

    FetchExpression和 QueryExpression之间的互相转化的msdn示例:

     https://msdn.microsoft.com/zh-cn/library/hh547457.aspx

  • 相关阅读:
    AntItemInventoryScene道具栏列表显示
    AntItemBaseScene的功能分析
    杀掉一直处于 正在终止 状态的并发请求
    oracle文件版本
    某个系统配置文件 用户层的SQL
    系统配置SQL profile
    (转)oracle 查看表所占用的空间大小
    Workflow Mailer Notifications设置
    System Hold, Fix Manager before resetting counters
    Linux mail 命令参数
  • 原文地址:https://www.cnblogs.com/parkerchen/p/16262404.html
Copyright © 2020-2023  润新知