高级查找 - 将相关实体与OR组合

时间:2013-08-01 13:34:45

标签: dynamics-crm-2011 dynamics-crm

有没有办法创建该查询?

enter image description here

我需要来自地址和联系地址的数据,通常我可以按Combine OR将它们合并,但不是在这种情况下。

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

3 个答案:

答案 0 :(得分:2)

我不知道如何做到这一点。

不是写一个插件,而是我会做一个报告。

我能想到的最简单的方法就是在没有像这样的过滤器的情况下进行fetchXML。

<fetch version="1.0" output-format="xml-platform" mapping="logical" distinct="true">
  <entity name="account">
    <attribute name="name" />
    <attribute name="primarycontactid" />
    <attribute name="telephone1" />
    <attribute name="accountid" />
    <attribute name="address1_city" />
    <order attribute="name" descending="false" />
    <link-entity name="contact" from="parentcustomerid" to="accountid" alias="ac">
        <attribute name="address1_city" />
    </link-entity>
  </entity>
</fetch>

然后使用

切换报表中行的可见性
=Fields!address1_city.Value="Sydney" Or Fields!ac_address1_city.Value="Sydney"

显然你可以用参数替换悉尼

答案 1 :(得分:2)

我解决了这个问题。

  • 使用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);
                }
            }

在您需要的ApllyFilter方法中:

  1. 从用户那里获取查询(他可以添加一些新的文件)。

  2. 使用GUID删除字段。

  3. 执行查询。

  4. 删除可能与您的OR声明冲突的文件。

  5. link-entity添加到查询。

  6. 执行查询。

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

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

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

答案 2 :(得分:0)

简单地说,没有办法通过高级查找来做你想要的。

您提供的示例查询只会向您显示相关联系人的地址匹配的帐户(以及显然匹配地址的帐户)。一旦您在高级查找中关联另一个实体,您将只看到具有相关记录的父母 - 没有能力(有效地)做外部联接。

您唯一的选择就是在Silverlight或HTML中构建内容并将其添加为Web资源 - 一旦在该代码中,您几乎可以显示您想要的任何内容。正如其他人所建议的那样,这在报告中是可能的。