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;
            }
        }

    }




}