【问题标题】:Skip CRM Record While Retreiving from CRM Using OrganizationServiceProxy使用 OrganizationServiceProxy 从 CRM 检索时跳过 CRM 记录
【发布时间】:2017-05-24 11:20:57
【问题描述】:

我正在使用 OrganizationServiceProxy 从 CRM 获取记录,我想从一开始就跳过一些记录。场景是,例如我有 2 个名为 A 和 B 的实体。我正在使用 OrganizationServiceProxy 的 RetrieveMultiple 方法。

A 有 27 条记录

B 有 32 条记录

总计 = 59

我有 1 个方法可以从两者中获取记录,第一优先级是实体 A,然后是实体 B。现在假设页面大小 = 10

在第一次通话中, 返回实体 A 的 10 条记录

在第二次通话中, 来自实体 A 的另外 10 条记录

在第三次通话中, 来自实体 A 的 7 条记录和来自实体 B 的 3 条记录

在第四次通话中, 来自实体 B 的 10 条记录(但我想跳过前 3 条并从第 4 条记录开始,因为它已经在第 3 次调用期间获取)

所以我想在从 CRM 获取数据时跳过记录。我搜索了很多,但没有得到任何东西。我的方法是,如果我从 CRM 获取所有记录并从 LINQ 进行分页。

【问题讨论】:

  • 等一下,您可以合并 2 个 RetrieveMultiple 结果集(实体 A + B)以在您的方法中获取合并的数据集。但是分页 cookie 用于 RetreiveMultiple 调用本身的分页..所以你必须使用 LINQ 在本地合并数据集中分页..

标签: c# linq dynamics-crm-2011 crm


【解决方案1】:

听起来您想使用分页 Cookie。请参阅链接以获取示例和更多信息。

https://msdn.microsoft.com/en-us/library/gg328046.aspx

编辑

您需要为循环的每次迭代重新创建分页 cookie,但要以现有分页 cookie 为基础。

下面的代码来自我链接到的示例。

    public string CreateXml(string xml, string cookie, int page, int count)
    {
        StringReader stringReader = new StringReader(xml);
        XmlTextReader reader = new XmlTextReader(stringReader);

        // Load document
        XmlDocument doc = new XmlDocument();
        doc.Load(reader);

        return CreateXml(doc, cookie, page, count);
    }

第一种方法获取您的 FetchXml、pagingcookie、当前页面和每页返回的项目数。它依次调用以下内容:

    public string CreateXml(XmlDocument doc, string cookie, int page, int count)
    {
        XmlAttributeCollection attrs = doc.DocumentElement.Attributes;

        if (cookie != null)
        {
            XmlAttribute pagingAttr = doc.CreateAttribute("paging-cookie");
            pagingAttr.Value = cookie;
            attrs.Append(pagingAttr);
        }

        XmlAttribute pageAttr = doc.CreateAttribute("page");
        pageAttr.Value = System.Convert.ToString(page);
        attrs.Append(pageAttr);

        XmlAttribute countAttr = doc.CreateAttribute("count");
        countAttr.Value = System.Convert.ToString(count);
        attrs.Append(countAttr);

        StringBuilder sb = new StringBuilder(1024);
        StringWriter stringWriter = new StringWriter(sb);

        XmlTextWriter writer = new XmlTextWriter(stringWriter);
        doc.WriteTo(writer);
        writer.Close();

        return sb.ToString();
    }

这会构建您的新 FetchXml 以返回下一页结果,但会使用当前的分页 cookie 来确定需要返回的下一页。

那么只需调用以下命令即可获得结果;

RetrieveMultipleRequest fetchRequest1 = new RetrieveMultipleRequest
{
     Query = new FetchExpression(xml)
};

EntityCollection returnCollection = ((RetrieveMultipleResponse)_service.Execute(fetchRequest1)).EntityCollection;

通读链接中的完整代码示例,确保您了解它的作用。都在那里。

【讨论】:

  • 从页面 cookie 我能够获取最后一个元素的唯一标识符..但是如何在最后一个记录之后获取记录?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-06-24
  • 1970-01-01
  • 2017-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多