Domanda

Ho evitato di lavorare con fetchxml poiché non ero sicuro del modo migliore di gestire i dati dei risultati dopo aver chiamato crmService.Fetch (fetchXml). In un paio di situazioni, ho usato un XDocument con LINQ per recuperare i dati da questa struttura di dati, come ad esempio:

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

Qual è il modo migliore per gestire i dati dei risultati di fetchxml, in modo che possano essere facilmente utilizzati. Applicazioni come passare questi record in un datagrid ASP.NET sarebbero piuttosto utili.

È stato utile?

Soluzione

In genere evito FetchXML proprio per questo motivo. Puoi usare RetrieveMultiple per ottenere oggetti BusinessEntity fortemente tipizzati e sostanzialmente fare la stessa cosa.

Ma se vuoi usare FetchXML questo esempio dovrebbe coprirti:

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

Altri suggerimenti

Mi piace la flessibilità di FetchXML e quindi ho sviluppato la seguente funzione che restituisce un datatable per l'uso in associazione a griglie e ripetitori e così via.

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

L'array di stringhe requiredFields è lì perché le colonne non vengono restituite se il set di risultati non contiene dati con quella colonna, tuttavia potrei volere la colonna in atto per il motivo esatto di associazione a datagrid ecc.

CrmService è una classe singleton che avvia il servizio web.

Speriamo che questo ti sia utile.

Con QueryExpression non è possibile eseguire query su molte entità e non è possibile recuperare gli attributi da più di un'entità alla volta, quindi è necessario utilizzare FetchXML.

Sfortunatamente il progetto codeplex di LinqToCRM è diventato obsoleto (1 anno senza una nuova versione, ma sembra essere una buona implementazione, migliore della versione di Microsoft) con la versione 4.0.12 dell'SDK di CRM che conteneva un provider linq per dynamics crm , ma ho letto alcuni articoli su questa nuova versione e non è molto buona, sembra essere una "scarsa implementazione" con molte limitazioni (cache forzata ecc.).

Vedo molte persone che usano LinqToXML e DataSet per ottenere risultati FetchXML, ma non saprei dire quale sia il modo migliore per affrontarlo. Cosa ne pensi di questo?

Christophe Trevisani Chavey.

Potresti anche scegliere LinqtoCRM, che gestirà l'analisi XML per te: http://codeplex.com/linqtocrm

Se si desidera utilizzare un fetchxml E ottenere un valore di ritorno di BusinessEntityType, è possibile utilizzare il Metodo FetchXmlToQueryExpression per ottenere un'espressione di query da fetchxml e quindi applicare l'espressione di query in un metodo RetrieveMultiple come in

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

Nota che esiste anche il metodo inverso QueryExpressiontoFetchXml

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top