我使用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进行分页。
答案 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;
仔细阅读链接中的完整代码示例,确保您了解它的作用。它就在那里。