使用OrganizationServiceProxy从CRM中撤回时跳过CRM记录

时间:2017-05-24 11:20:58

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

我使用OrganizationServiceProxy从CRM获取记录,我想从头开始跳过一些记录。例如,我有两个实体,叫做A和B.我正在使用OrganizationServiceProxy的RetrieveMultiple方法。

A有27条记录

B有32条记录

总计= 59

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

第一次通话

来自实体A的10条记录是

第二次通话

来自实体A的另外10条记录

第3次通话

来自实体A的7条记录和来自实体B的3条记录

第四次电话

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

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

1 个答案:

答案 0 :(得分:2)

听起来你想要使用Paging Cookies。请参阅链接以获取示例和更多信息。

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;

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