高级查找 - 将相关权利与OR相结合

Mak*_*nov 8 dynamics-crm dynamics-crm-2011

有没有办法创建该查询?

在此输入图像描述

我需要来自Adress和Contact Adress的数据,通常我可以将它们组合在一起Combine OR但不是在这种情况下.

我想我必须用PreExecute()方法编写新的插件,获取我的查询,解析数据然后手动获得相同的地址或者还有其他方法吗?

Mak*_*nov 3

我解决了这个问题。

  • Execute()创建用于使用方法和数据解析方法进行预验证的插件。
  • 在实体视图中添加一些带有 的字段GUID
  • 如果插件在您的视图中找到 guid,它将获取您的实体的 fetchxml 查询,第二个查询实体将显示默认视图。
  • 解析数据以获取您想要向用户显示的内容。
  • 注册您的插件。
  • 利润。

PS 在重构并获得客户批准后,我将在一两天内添加源。

编辑:

首先 - 您需要创建新的GUID并添加字符串字段以使用该 guid 进行查看(最好对用户隐藏它)。创建具有RetrieveMultiple操作和Post验证的插件(在Pre操作中您可能会丢失更改)

在插件:主要方法中 RetrieveMultiple,它将获取上下文和服务,您将从中进行查询,然后您需要获取 fetchXml 并检查是否有您的GUID.

            string fetchXml = string.Empty;
            var query = context.InputParameters["Query"] as QueryExpression;
            var fetchQuery = context.InputParameters["Query"] as FetchExpression;

                if (query == null)
                {
                    if (fetchQuery == null)
                    {
                    return;
                    }
               fetchXml = fetchQuery.Query;
                }

                // Convert query to a fetch expression for processing and apply filter
                else
                {
                    fetchXml =
                        ((QueryExpressionToFetchXmlResponse)
                            service.Execute(new QueryExpressionToFetchXmlRequest {Query = query})).FetchXml;
                }

                if (fetchXml.Contains(OpportunityFilterGuid))
            {
                    ApplyFilter(context, service, query);
                }
            }
Run Code Online (Sandbox Code Playgroud)

在你的ApllyFilter方法中你需要:

  1. 获取用户的查询(他可以添加一些新字段)。

  2. 使用 删除您的字段GUID

  3. 执行查询。

  4. 删除可能与您的OR声明相冲突的字段。

  5. 添加link-entity到查询。

  6. 执行查询。

  7. 将从第二个查询接收到的实体添加到第一个查询中。

  8. 使用 LINQ 选择不重复的实体。

     collectionOne.Entities.GroupBy(oppId => oppId.Id).Select(opp => opp.First())
    
    Run Code Online (Sandbox Code Playgroud)
  9. 将该数据发送给客户端。