2016-12-12 3 views
0

이 쿼리로 가져오고 자하는 레코드가 5000 개를 초과하지만 매번 null 값을 가진 쿠키를 얻습니다. 링크 된 엔티티가 문제라는 것을 깨달았습니다. 쿠키를 제거 할 때마다 매번 쿠키가 생기기 때문입니다.CRM FetchXML에서 5000 개가 넘는 레코드를 가져옵니다.

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

누구나이 요청으로 페이징 쿠키를 얻는 방법을 알고 있습니까?

답변

0

이 문제의 해결책은 루트 엔터티에 ID 열을 지정해야한다는 것입니다. 이 예에서는 루트 listmember 엔티티에 listmemberid 속성을 추가해야합니다.

<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> 
0

귀하의 게시물을 읽음으로써 제가 전에 들었던 것을 상기 시켰고, 확실히 필자는 메모에 가서 "링크 성이있는 Fetchxml이 페이징을 지원하지 않습니다"라는 것을 보았습니다. 그러나 이상하게 느껴지는 제한 사항에 대한 공식 정보는 찾을 수 없습니다.

어쨌든 링크 엔티티가 포함 된 쿼리를 가져 오는 것이 페이징을 지원하지 않는다고 확신합니다. 대신 QueryExpression을 사용하여 실행 해보십시오.

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

    } 




} 
+0

시도 코드를 설명합니다. – Gahan