1. 程式人生 > 其它 >Dynamics 365 通過外掛中的retrievemultiple訊息來過濾產品檢視

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