7
votes

Comment gérez-vous les données de résultat FETCHXML?

J'ai évité de travailler avec fetchxml car je n'ai pas été sûr de la meilleure façon de 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);    
    }
}


0 commentaires

5 Réponses :


1
votes

J'évite généralement fetchxml pour cette raison même. Vous pouvez utiliser la récupération pour obtenir des objets d'appréciation fortement typés et faire fondamentalement les mêmes choses.

Mais si vous souhaitez utiliser le FETCHXML, cet exemple devrait vous couvrir:

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


3 commentaires

Oui, j'utilise principalement des retrieietiple, mais dans ce cas, je dois récupérer certains attributs et ajouter des conditions basées sur des entités jointes, que FetchXML me permettra de le faire et que l'objet QueryExpression ne permettra pas.


Luke, es-tu sûr? La récupération de QueryExpression a également des moyens de définir des jointures.


Oui, vous pouvez définir des jointures, mais je suis assez sûr que vous ne pouvez pas retourner des attributs d'une entité jointe.



0
votes

Vous pouvez également aller pour Linqtocrm, qui gérera l'analyse XML pour vous: http://codeplex.com/linqtocrm


0 commentaires

6
votes

J'apprécie la flexibilité de FETCHXML et j'ai donc développé la fonction suivante qui renvoie un jeu de données pour une utilisation dans la liaison avec les réseaux et les 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;
    }


3 commentaires

+1 Magnificent, merci d'avoir indiqué la réponse la plus claire (tournant le XML retourné dans une table).


Salut Fishcake, ça a l'air génial - j'obtiens une erreur cependant sur la ligne TomService = Crmwebservice; "Le nom" crmwebservice "n'existe pas dans le contexte actuel" - aucune idée s'il vous plaît? Merci!


note : résultat de la chaîne = tomservice.fetch (fetchxml); ne fonctionne pas dans CRM 2016 , et obsolète dans CRM 2011



0
votes

Si vous souhaitez utiliser un fetchxml et obtenir un retour d'entreprise de l'entreprise, vous pouvez utiliser le FETCHXMLTOQueryExpression Méthode pour obtenir une expression de requête à partir du fetchxml puis appliquer l'expression de la requête dans une méthode de récupération comme dans xxx

Notez que la méthode inverse QUERYEXPRESPRESTOFFETOFS existe également


0 commentaires

1
votes

avec QueryExpression Vous ne pouvez pas interroger de nombreuses entités et ne pas récupérer des attributs de plus d'une entité à la fois, vous devez donc utiliser FETCHXML.

Malheureusement, le projet CodePlex de Linqtocrm a été obsolète (1 an sans nouvelle libération, mais il semble être une bonne implémentation, mieux que la version de Microsoft) avec la version de 4.0.12 du SDK de CRM contenait un fournisseur LINQ pour Dynamics CRM , mais j'ai lu un article sur cette nouvelle version et ce n'est pas très bon, semble être une "mauvaise mise en œuvre" avec beaucoup de limitations (cache forcée, etc.).

Je vois beaucoup de personnes à l'aide de Linqtoxml et de jeu de données pour mener du résultat FETCHXML, mais je ne pouvais pas dire quel est le meilleur moyen de gérer. Que pensez-vous de cela?

Christophe Trevisani Chavavey.


1 commentaires

C'est en fait la mise en cache par défaut, vous pouvez l'éteindre si vous ajoutez des options de configuration au fichier de configuration. juste FYI