Freigeben über


Page große Ergebnismengen mit FetchXML

Sie können die Ergebnisse einer FetchXML Abfrage mithilfe des Paging-Cookies seitenweise anzeigen. Das Auslagerungscookie ist eine Leistungsfunktion, durch die das Auslagern in der Anwendung für sehr große Datasets schneller ausgeführt wird. Wenn Sie eine Datensatzgruppe abfragen, enthält das Ergebnis einen Wert für das Auslagerungscookie. Um eine höhere Leistung zu erzielen, können Sie diesen Wert übergeben, wenn Sie die folgende Datensatzgruppe abrufen.

FetchXML und QueryExpression verwenden unterschiedliche Formate für ihre Paging-Cookies. Wenn Sie eine Konvertierung von einem Abfrageformat in anderes durchführen, indem Sie die FetchXmlToQueryExpressionRequest- oder die QueryExpressionToFetchXmlRequest-Meldung verwenden, wird der Auslagerungscookiewert ignoriert. Wenn Sie nicht aufeinanderfolgende Seiten abfragen, wird der Auslagerungscookiewert außerdem ignoriert.

Wenn Sie das Paging-Cookie mit FetchXML verwenden, müssen Sie den Cookie-Wert in XML kodieren. Das folgende Beispiel zeigt, wie das XML-codierte Cookie aussieht, wenn das Paging-Cookie mit FetchXML verwendet wird:

strQueryXML = @"  
<fetch mapping='logical' paging-cookie='&lt;cookie page=&quot;1&quot;&gt;&lt;accountid last=&quot;{E062B974-7F8D-DC11-9048-0003FF27AC3B}&quot; first=&quot;{60B934EF-798D-DC11-9048-0003FF27AC3B}&quot;/&gt;&lt;/cookie&gt;' page='2' count='2'>  
 <entity name='account'>  
  <all-attributes/>  
 </entity>  
</fetch>";  

Das folgende Beispiel zeigt, wie das Paging-Cookie mit einer FetchXML Abfrage verwendet wird. Den vollständigen Beispielcode finden Sie unter Beispiel: Verwendung FetchXML mit einem Paging-Cookie.

// Define the fetch attributes.
// Set the number of records per page to retrieve.
int fetchCount = 3;
// Initialize the page number.
int pageNumber = 1;
// Initialize the number of records.
int recordCount = 0;
// Specify the current paging cookie. For retrieving the first page, 
// pagingCookie should be null.
string pagingCookie = null;

// Create the FetchXml string for retrieving all child accounts to a parent account.
// This fetch query is using 1 placeholder to specify the parent account id 
// for filtering out required accounts. Filter query is optional.
// Fetch query also includes optional order criteria that, in this case, is used 
// to order the results in ascending order on the name data column.
string fetchXml = string.Format(@"<fetch version='1.0' 
                                mapping='logical' 
                                output-format='xml-platform'>
                                <entity name='account'>
                                    <attribute name='name' />
                                    <attribute name='emailaddress1' />
                                    <order attribute='name' descending='false'/>
                                    <filter type='and'>
                            <condition attribute='parentaccountid' 
                                            operator='eq' value='{0}' uiname='' uitype='' />
                                    </filter>
                                </entity>
                            </fetch>",
                                _parentAccountId);

Console.WriteLine("Retrieving data in pages\n"); 
Console.WriteLine("#\tAccount Name\t\t\tEmail Address");

while (true)
{
    // Build fetchXml string with the placeholders.
    string xml = CreateXml(fetchXml, pagingCookie, pageNumber, fetchCount);

    // Excute the fetch query and get the xml result.
    RetrieveMultipleRequest fetchRequest1 = new RetrieveMultipleRequest
    {
        Query = new FetchExpression(xml)
    };

    EntityCollection returnCollection = ((RetrieveMultipleResponse)_service.Execute(fetchRequest1)).EntityCollection;
    
    foreach (var c in returnCollection.Entities)
    {
        System.Console.WriteLine("{0}.\t{1}\t\t{2}", ++recordCount, c.Attributes["name"], c.Attributes["emailaddress1"] );
    }                        
    
    // Check for morerecords, if it returns 1.
    if (returnCollection.MoreRecords)
    {
        Console.WriteLine("\n****************\nPage number {0}\n****************", pageNumber);
        Console.WriteLine("#\tAccount Name\t\t\tEmail Address");
        
        // Increment the page number to retrieve the next page.
        pageNumber++;

        // Set the paging cookie to the paging cookie returned from current results.                            
        pagingCookie = returnCollection.PagingCookie;
    }
    else
    {
        // If no more records in the result nodes, exit the loop.
        break;
    }
}

Dieser Code hängt von einer statischen CreateXml unten gezeigte Methode ab:

public static string CreateXml(string xml, string cookie, int page, int count)
{
    StringReader stringReader = new StringReader(xml);
    var reader = new XmlTextReader(stringReader);

    // Load document
    XmlDocument doc = new XmlDocument();
    doc.Load(reader);

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

Siehe auch

Paging-Verhalten und Ordnen
Beispiel: Verwendung FetchXML mit einem Paging-Cookie
Erstellen von Abfragen mit FetchXML
Geschäftsjahr und älter als Datum/Uhrzeit-Abfrageoperatoren in FetchXML
Verwenden von FetchXML
Auslagern von umfangreichen Ergebnissätzen mit QueryExpression

Hinweis

Können Sie uns Ihre Präferenzen für die Dokumentationssprache mitteilen? Nehmen Sie an einer kurzen Umfrage teil. (Beachten Sie, dass diese Umfrage auf Englisch ist.)

Die Umfrage dauert etwa sieben Minuten. Es werden keine personenbezogenen Daten erhoben. (Datenschutzbestimmungen).