CRM FetchXML获取超过5000条记录

时间:2016-12-12 13:21:28

标签: dynamics-crm crm fetchxml

我想要使用此查询获取超过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吗?

3 个答案:

答案 0 :(得分:0)

阅读你的帖子提醒我之前我已经听过这个,当然我去了我的笔记,看到“带有linkentity的Fetchxml不支持分页”。但是,我似乎无法找到有关限制的任何官方信息,这感觉很奇怪。

无论如何,我很确定使用链接实体的获取查询不支持分页。请尝试使用QueryExpression执行。

答案 1 :(得分:0)

此特定问题的解决方案是您需要在根实体上指定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>

答案 2 :(得分:-1)

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

    }




}