程序员人生 网站导航

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

栏目:htmlcss时间:2018-06-11 17:10:05

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

    先来看张插件注册的截图,插件的message是retrievemultiple,对应的实体我这里用的是product(为何用它是由于它特殊,由于它特殊才有了本篇博文),事件是pre-operation(这个很好理解,在展现数据之前就要过滤好,1定是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了,调试下来发现取到的都是下面这些鬼

email

queue

solution

savedquery

systemuserroles

rb_userroleviewconfiguration

rb_roleviewconfiguration

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



      我尝试的实体不多,目前发现的产品、客户、联系人都是这类情况,自定义的实体用QueryExpression都ok的,1开始猜想是否是系统实体都改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

------分隔线----------------------------
------分隔线----------------------------

最新技术推荐