Partager via


Page de grands ensembles de résultats avec FetchXML

Vous pouvez paginer les résultats d’une FetchXML requête en utilisant le cookie de pagination. Le cookie de pagination est une fonctionnalité de performances qui permet d’accélérer la pagination dans l’application pour les plus grands ensembles de données. Lorsque vous demandez un ensemble d’enregistrements, les résultats contiennent une valeur pour le cookie de pagination. Pour des performances optimisées, vous pouvez transmettre cette valeur lorsque vous récupérez l’ensemble d’enregistrements suivant.

FetchXML et QueryExpression utilisent différents formats pour leurs cookies de pagination. Si vous convertissez un format de requête en un autre format à l’aide du message FetchXmlToQueryExpressionRequest ou du message QueryExpressionToFetchXmlRequest, la valeur du cookie de pagination est ignorée. En outre, si vous demandez des pages non consécutives, la valeur du cookie de pagination est ignorée.

Lorsque vous utilisez le cookie de pagination avec FetchXML, vous devez coder en XML la valeur du cookie. L’exemple suivant montre à quoi ressemble le cookie codé XML lors de l’utilisation du cookie de pagination avec FetchXML :

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

L’exemple suivant montre comment utiliser le cookie de pagination avec une FetchXML requête. Pour obtenir un exemple de code complet, consultez Exemple : Utiliser FetchXML avec un cookie de pagination.

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

Ce code dépend d’une méthode CreateXml statique illustrée ci-dessous :

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

Voir aussi

Comportements de pagination et ordre
Exemple : Utilisation FetchXML avec un cookie de pagination
Création de requêtes avec FetchXML
Date fiscale et opérateurs de requête plus anciens que datetime dans FetchXML
En utilisant FetchXML
Mettre en page d’importants ensembles de résultats avec QueryExpression

Notes

Pouvez-vous nous indiquer vos préférences de langue pour la documentation ? Répondez à un court questionnaire. (veuillez noter que ce questionnaire est en anglais)

Le questionnaire vous prendra environ sept minutes. Aucune donnée personnelle n’est collectée (déclaration de confidentialité).