2017-05-24 3 views
1

CRM에서 OrganizationServiceProxy를 사용하여 레코드를 가져오고 처음부터 일부 레코드를 건너 뛰고 싶습니다. 시나리오는 예를 들어 A와 B라는 두 개의 엔티티가 있습니다. OrganizationServiceProxy의 RetrieveMultiple 메소드를 사용하고 있습니다.OrganizationServiceProxy를 사용하여 CRM에서 철수하는 동안 CRM 레코드 건너 뛰기

A는 27 개 레코드

을 갖는다

B는, 우선은 엔티티 A 다음 엔티티 B. 지금 가정 59

및 I 모두에서 레코드를 인출 한 방법을 갖는 32 개 개의 기록

토탈 =했다 페이지 크기 = 엔티티 A로부터 제 10 호에

, 10 기록 반환이다

,174 2 호출

, 제 3 호에서 엔티티 A

에서 다른 10 개 개의 레코드, 엔티티 A로부터 (7) 기록과 엔티티 B 3 개 레코드 4 호출

, 10 기록 엔티티 B 에서 (그러나 3 번째 통화를 건너 뛰고 싶습니다. 3 번째 통화 중에 이미 가져 왔으므로 4 번째 레코드에서 시작합니다.)

그래서 CRM에서 데이터를 가져 오는 동안 레코드를 건너 뛸 수 없습니다. 나는 많은 것을 검색했지만 어떤 것도 얻지 못했습니다. 내가 방법은 CRM에서 모든 레코드를 가져오고 LINQ에서 페이지 매김을 수행하는 경우입니다.

+0

대기, 메서드 내에서 병합 된 데이터 집합을 가져 오기 위해 2 개의 RetrieveMultiple 결과 집합 (엔티티 A + B)의 조합을 관리합니다.그러나 페이징 쿠키는 RetreiveMultiple 호출 자체에서 페이지 매김을하기 때문에 LINQ를 사용하여 로컬 병합 된 데이터 집합에서 페이지 매김을해야합니다. 마지막 쿠키의 고유 식별자를 얻을 수있는 페이지 쿠키의 –

답변

2

페이징 쿠키를 사용하려는 것 같습니다. 보기 및 더 많은 정보를위한 연결을보십시오.

https://msdn.microsoft.com/en-us/library/gg328046.aspx

편집

당신은 루프의 각 반복에 대한 페이징 쿠키를 다시하지만, 기존의 페이징 쿠키에 기초해야합니다.

아래의 코드는 내가 링크 된 예입니다.

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을 축적하지만, 반환 할 필요가있는 다음 페이지인지를 결정하기 위해 현재의 페이징 쿠키를 사용합니다 : 그것은 다시 다음을 호출합니다.

다음은 결과를 얻기 위해 다음을 호출하는 것입니다.

RetrieveMultipleRequest fetchRequest1 = new RetrieveMultipleRequest 
{ 
    Query = new FetchExpression(xml) 
}; 

EntityCollection returnCollection = ((RetrieveMultipleResponse)_service.Execute(fetchRequest1)).EntityCollection; 

링크의 전체 코드 샘플을 읽고 그것이 무엇을하는지 이해하고 있는지 확인하십시오. 모든 것이 있습니다.

+0

을 가져올 수는 있지만 어떻게 마지막 레코드를 가져올 수 있습니까? –