CRM FetchXML 获取超过 5000 条记录
CRM FetchXML fetch more than 5000 records
我有超过 5000 条记录要通过此查询获取,但我每次都得到空值的 cookie。我意识到链接实体是这里的问题,因为当我删除它时,我每次都会得到 cookie。
<fetch version="1.0" mapping="logical" distinct="true" page="1" count="2000" >
<entity name="listmember" >
<link-entity name="contact" from="contactid" to="entityid" alias="c" >
<attribute name="contactid" />
<attribute name="telephone1" />
<link-entity name="phonecall" from="ic_customer" to="contactid" alias="pc" link-type="outer" distinct="true">
<attribute name="activityid" />
<filter type="and" >
<filter type="or" >
<condition attribute="statuscode" operator="eq" value="1" />
<condition attribute="ic_end" operator="on-or-after" value="2016-11-12" />
</filter>
</filter>
</link-entity>
<filter type="and" >
<condition attribute="statecode" operator="eq" value="0" />
<condition attribute="telephone1" operator="not-null" />
<condition attribute="donotphone" operator="eq" value="0" />
</filter>
</link-entity>
<filter type="and" >
<condition attribute="listid" operator="in" >
<value>
{f89087ef-7017-e611-80e3-5065f38a3951}
</value>
</condition>
<condition entityname="pc" attribute="activityid" operator="null" />
</filter>
</entity>
</fetch>
有人知道如何通过此请求获取分页 cookie 吗?
阅读您的 post 让我想起我以前听说过这个,果然我去看了笔记并看到了 "Fetchxml with linkentity doesn't support paging"。但是,我好像找不到任何关于限制的官方信息,感觉很奇怪。
无论如何,我很确定使用 link 实体获取查询是不支持分页的。尝试使用 QueryExpression 执行。
此特定问题的解决方案是您需要在根实体上指定 ID 列。在此示例中,您需要将 listmemberid
属性添加到根 listmember
实体。
<fetch version="1.0" mapping="logical" distinct="true" page="1" count="2000" >
<entity name="listmember" >
<attribute name="listmemberid" />
<link-entity name="contact" from="contactid" to="entityid" alias="c" >
<attribute name="contactid" />
<attribute name="telephone1" />
<link-entity name="phonecall" from="ic_customer" to="contactid" alias="pc" link-type="outer" distinct="true">
<attribute name="activityid" />
<filter type="and" >
<filter type="or" >
<condition attribute="statuscode" operator="eq" value="1" />
<condition attribute="ic_end" operator="on-or-after" value="2016-11-12" />
</filter>
</filter>
</link-entity>
<filter type="and" >
<condition attribute="statecode" operator="eq" value="0" />
<condition attribute="telephone1" operator="not-null" />
<condition attribute="donotphone" operator="eq" value="0" />
</filter>
</link-entity>
<filter type="and" >
<condition attribute="listid" operator="in" >
<value>
{f89087ef-7017-e611-80e3-5065f38a3951}
</value>
</condition>
<condition entityname="pc" attribute="activityid" operator="null" />
</filter>
</entity>
</fetch>
using System;
using System.Data;
using Microsoft.SqlServer.Dts.Pipeline.Wrapper;
using Microsoft.SqlServer.Dts.Runtime.Wrapper;
using Microsoft.Xrm.Sdk;
using System.ServiceModel.Description;
using Microsoft.Xrm.Sdk.Client;
using Microsoft.Xrm.Sdk.Query;
[Microsoft.SqlServer.Dts.Pipeline.SSISScriptComponentEntryPointAttribute]
public class ScriptMain : UserComponent
{
IOrganizationService organizationservice;
public override void PreExecute()
{
base.PreExecute();
ClientCredentials credentials = new ClientCredentials();
credentials.UserName.UserName = "username";
credentials.UserName.Password = "password";
credentials.Windows.ClientCredential = System.Net.CredentialCache.DefaultNetworkCredentials;
organizationservice = new OrganizationServiceProxy(
new Uri("_your org service_Organization.svc"), null, credentials, null);
}
public override void PostExecute()
{
base.PostExecute();
}
public override void CreateNewOutputRows()
{
QueryExpression query = new QueryExpression("account")
{
ColumnSet = new ColumnSet(new string[] { "accountnumber" }),
PageInfo = new PagingInfo()
{
Count = 250,
PageNumber = 1,
ReturnTotalRecordCount = false,
PagingCookie = null
}
};
EntityCollection results = null;
while (true)
{
results = organizationservice.RetrieveMultiple(query);
foreach (Entity record in results.Entities)
{
accountBuffer.AddRow();
if (record.Contains("accountnumber"))
accountBuffer.accountnumber = record.GetAttributeValue<string>("accountnumber");
}
if (results.MoreRecords)
{
query.PageInfo.PageNumber++;
query.PageInfo.PagingCookie = results.PagingCookie;
}
else
{
break;
}
}
}
}
我有超过 5000 条记录要通过此查询获取,但我每次都得到空值的 cookie。我意识到链接实体是这里的问题,因为当我删除它时,我每次都会得到 cookie。
<fetch version="1.0" mapping="logical" distinct="true" page="1" count="2000" >
<entity name="listmember" >
<link-entity name="contact" from="contactid" to="entityid" alias="c" >
<attribute name="contactid" />
<attribute name="telephone1" />
<link-entity name="phonecall" from="ic_customer" to="contactid" alias="pc" link-type="outer" distinct="true">
<attribute name="activityid" />
<filter type="and" >
<filter type="or" >
<condition attribute="statuscode" operator="eq" value="1" />
<condition attribute="ic_end" operator="on-or-after" value="2016-11-12" />
</filter>
</filter>
</link-entity>
<filter type="and" >
<condition attribute="statecode" operator="eq" value="0" />
<condition attribute="telephone1" operator="not-null" />
<condition attribute="donotphone" operator="eq" value="0" />
</filter>
</link-entity>
<filter type="and" >
<condition attribute="listid" operator="in" >
<value>
{f89087ef-7017-e611-80e3-5065f38a3951}
</value>
</condition>
<condition entityname="pc" attribute="activityid" operator="null" />
</filter>
</entity>
</fetch>
有人知道如何通过此请求获取分页 cookie 吗?
阅读您的 post 让我想起我以前听说过这个,果然我去看了笔记并看到了 "Fetchxml with linkentity doesn't support paging"。但是,我好像找不到任何关于限制的官方信息,感觉很奇怪。
无论如何,我很确定使用 link 实体获取查询是不支持分页的。尝试使用 QueryExpression 执行。
此特定问题的解决方案是您需要在根实体上指定 ID 列。在此示例中,您需要将 listmemberid
属性添加到根 listmember
实体。
<fetch version="1.0" mapping="logical" distinct="true" page="1" count="2000" >
<entity name="listmember" >
<attribute name="listmemberid" />
<link-entity name="contact" from="contactid" to="entityid" alias="c" >
<attribute name="contactid" />
<attribute name="telephone1" />
<link-entity name="phonecall" from="ic_customer" to="contactid" alias="pc" link-type="outer" distinct="true">
<attribute name="activityid" />
<filter type="and" >
<filter type="or" >
<condition attribute="statuscode" operator="eq" value="1" />
<condition attribute="ic_end" operator="on-or-after" value="2016-11-12" />
</filter>
</filter>
</link-entity>
<filter type="and" >
<condition attribute="statecode" operator="eq" value="0" />
<condition attribute="telephone1" operator="not-null" />
<condition attribute="donotphone" operator="eq" value="0" />
</filter>
</link-entity>
<filter type="and" >
<condition attribute="listid" operator="in" >
<value>
{f89087ef-7017-e611-80e3-5065f38a3951}
</value>
</condition>
<condition entityname="pc" attribute="activityid" operator="null" />
</filter>
</entity>
</fetch>
using System;
using System.Data;
using Microsoft.SqlServer.Dts.Pipeline.Wrapper;
using Microsoft.SqlServer.Dts.Runtime.Wrapper;
using Microsoft.Xrm.Sdk;
using System.ServiceModel.Description;
using Microsoft.Xrm.Sdk.Client;
using Microsoft.Xrm.Sdk.Query;
[Microsoft.SqlServer.Dts.Pipeline.SSISScriptComponentEntryPointAttribute]
public class ScriptMain : UserComponent
{
IOrganizationService organizationservice;
public override void PreExecute()
{
base.PreExecute();
ClientCredentials credentials = new ClientCredentials();
credentials.UserName.UserName = "username";
credentials.UserName.Password = "password";
credentials.Windows.ClientCredential = System.Net.CredentialCache.DefaultNetworkCredentials;
organizationservice = new OrganizationServiceProxy(
new Uri("_your org service_Organization.svc"), null, credentials, null);
}
public override void PostExecute()
{
base.PostExecute();
}
public override void CreateNewOutputRows()
{
QueryExpression query = new QueryExpression("account")
{
ColumnSet = new ColumnSet(new string[] { "accountnumber" }),
PageInfo = new PagingInfo()
{
Count = 250,
PageNumber = 1,
ReturnTotalRecordCount = false,
PagingCookie = null
}
};
EntityCollection results = null;
while (true)
{
results = organizationservice.RetrieveMultiple(query);
foreach (Entity record in results.Entities)
{
accountBuffer.AddRow();
if (record.Contains("accountnumber"))
accountBuffer.accountnumber = record.GetAttributeValue<string>("accountnumber");
}
if (results.MoreRecords)
{
query.PageInfo.PageNumber++;
query.PageInfo.PagingCookie = results.PagingCookie;
}
else
{
break;
}
}
}
}