Question

J'ai évité de travailler avec fetchxml car je ne savais pas comment gérer les données de résultat après avoir appelé crmService.Fetch (fetchXml). Dans quelques situations, j’ai utilisé un XDocument avec LINQ pour récupérer les données de cette structure de données, telles que:

XDocument resultset = XDocument.Parse(_service.Fetch(fetchXml));
if (resultset.Root == null || !resultset.Root.Elements("result").Any())
{
    return;
}
foreach (var displayItem in resultset.Root.Elements("result").Select(item => item.Element(displayAttributeName)).Distinct())
{
    if (displayItem!= null && displayItem.Value != null)
    {
        dropDownList.Items.Add(displayItem.Value);    
    }
}

Quel est le meilleur moyen de gérer les données de résultat fetchxml, afin de pouvoir les utiliser facilement. Des applications telles que la transmission de ces enregistrements dans une grille de données ASP.NET seraient très utiles.

Était-ce utile?

La solution

J'évite généralement FetchXML pour cette raison même. Vous pouvez utiliser RetrieveMultiple pour obtenir des objets BusinessEntity fortement typés et effectuer les mêmes opérations.

Mais si vous voulez utiliser FetchXML, cet exemple devrait vous couvrir:

http://msdn.microsoft.com/en-us/library /ms914457.aspx

Autres conseils

J'aime la flexibilité de FetchXML et j’ai donc développé la fonction suivante qui renvoie une date utilisable pour la liaison aux grilles et aux répéteurs, etc.

.
        /// <summary>
    /// Takes a CRM FetchXML query and returns a DataTable
    /// </summary>
    /// <param name="fetchXml">The FetchXML query</param>
    /// <param name="requiredFields">A array of columns you'd expect returned. This is required as if there is no data for a field/column CRM will not return it which could impact databinding</param>
    /// <returns>A datatable containing the results of the FetchXML</returns>
    public static DataTable FetchXML2DataTable(string fetchXml, string[] requiredFields)
    {
        CrmService tomService = new CrmService();
        tomService = CrmWebService;

        string result = tomService.Fetch(fetchXml);
        DataSet ds = new DataSet();

        System.IO.StringReader reader = new System.IO.StringReader(result);
        ds.ReadXml(reader);

        DataTable dt = ds.Tables[1];

        //check all required columns are present otherwise add them to make life easier for databinding at the top level
        //caused by CRM not returning fields if they contain no data
        foreach (string field in requiredFields)
        {   //Check for column names and nested tables
            if ((dt.Columns.IndexOf(field) < 0) && (dt.DataSet.Tables.IndexOf(field) <0))
            {                    
                //Add column to datatable even though it is empty for reason stated above
                dt.Columns.Add(new DataColumn(field));
            }
        }            

        return dt;
    }

Le tableau de chaînes requiredFields est présent, car les colonnes ne sont pas renvoyées si votre jeu de résultats ne contient aucune donnée avec cette colonne. Toutefois, je souhaiterais peut-être que la colonne soit en place pour la raison exacte de la liaison aux datagrids, etc.

CrmService est une classe singleton qui lance le service Web.

J'espère que cela vous sera utile.

Avec QueryExpression, vous ne pouvez pas interroger plusieurs entités à la fois, ni récupérer des attributs à la fois, vous devez donc utiliser FetchXML.

Malheureusement, le projet codeplex de LinqToCRM est devenu obsolète (un an sans nouvelle version, mais il semble que ce soit une bonne implémentation, meilleure que la version de Microsoft) avec la version 4.0.12 du SDK de CRM qui contenait un fournisseur linq pour dynamic , mais j’ai lu quelques articles sur cette nouvelle version et que ce n’est pas très bon, semble être une "mauvaise mise en oeuvre" avec beaucoup de limitations (cache forcé, etc.).

Je vois beaucoup de gens utiliser LinqToXML et DataSet pour diriger avec le résultat FetchXML, mais je ne saurais dire quel est le meilleur moyen de le gérer. Qu'en pensez-vous?

Christophe Trevisani Chavey.

Vous pouvez également opter pour LinqtoCRM, qui gérera l’analyse XML pour vous: http://codeplex.com/linqtocrm

Si vous souhaitez utiliser un fichier fetchxml ET obtenir un returnset de BusinessEntityType, vous pouvez utiliser le Méthode FetchXmlToQueryExpression pour obtenir une expression de requête à partir de fetchxml, puis appliquer l’expression de requête dans une méthode RetrieveMultiple comme dans

FetchXmlToQueryExpressionResponse qe = (FetchXmlToQueryExpressionResponse) service.Execute(fetch);

Notez que la méthode inverse QueryExpressiontoFetchXml existe également

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top