7

Ho evitato di lavorare con fetchxml in quanto non ero sicuro del modo migliore per 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 di questa struttura di dati, come ad esempio:Come gestite i dati del risultato fetchxml?

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 FetchXML, in modo che possa essere facilmente utilizzato . Applicazioni come passare questi record in un datagrid di ASP.NET sarebbero abbastanza utili.

risposta

1

In genere evito FetchXML proprio per questo motivo. Puoi utilizzare RetrieveMultiple per ottenere oggetti BusinessEntity fortemente tipizzati e fondamentalmente fare le stesse cose.

Ma se si desidera utilizzare il FetchXML questo campione dovrebbe coprire voi:

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

+0

Sì, ho utilizzato principalmente RetrieveMultiple, ma in questo caso ho bisogno di recuperare alcuni attributi e aggiungere alcune condizioni basate su entità unite, che fetchXml mi consentirà di fare e l'oggetto QueryExpression non lo consentirà. –

+0

Luke, sei sicuro?Recupero tramite QueryExpression ha anche dei modi per definire i join. – okutane

+0

Sì, è possibile definire join, ma sono abbastanza sicuro che non è possibile restituire attributi da un'entità congiunta. –

6

Mi piace la flessibilità di FetchXML e così ho sviluppato la seguente funzione che restituisce un datatable da utilizzare nel binding 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 restituiti se il set di risultati non contiene dati con quella colonna, però potrei desiderare la colonna in atto per l'esatto motivo di legarsi a DataGrids ecc

CrmService è una classe singleton che avvia il servizio web.

Speriamo che questo sia utile.

+0

+1 Magnifico, grazie per aver dichiarato la risposta più chiara (trasformando l'XML restituito in una tabella). –

+0

HI Fishcake, sembra geniale - sto ricevendo un errore sulla linea tomService = CrmWebService; "Il nome 'CrmWebService' non esiste nel contesto attuale" - qualche idea per favore? Grazie! – leddy

+0

** Nota **: 'stringa risultato = tomService.Fetch (fetchXml);' *** non funzionante *** in _CRM 2016_ e *** deprecato *** in _CRM 2011_ – Kiquenet

0

Se si desidera utilizzare un FetchXML e ottenere un returnset del BusinessEntityType, è possibile utilizzare il metodo FetchXmlToQueryExpression per ottenere un'espressione di query dal FetchXML e quindi applicare l'espressione di query in un metodo RetrieveMultiple come in

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

si noti che il metodo QueryExpressiontoFetchXml inverso esiste pure

1

Con QueryExpression non è possibile interrogare molti-a-molti dell'ente e non può recuperare gli attributi da più di una società alla volta, quindi è necessario utilizzare FetchXML.

Purtroppo il progetto di codeplex di LinqToCRM è diventato obsoleto (1 anno senza nuova versione, ma sembra essere una buona implementazione, migliore della versione di microsoft) con il rilascio di 4.0.12 dell'SDK di CRM che conteneva un provider linq per la dinamica crm, ma ho letto qualche articolo su questa nuova release e non è molto bello, sembra essere una "cattiva implementazione" con molte limitazioni (cache forzata ecc.).

Vedo molta gente che usa LinqToXML e DataSet per avere risultati con FetchXML, ma non ho potuto dire quale sia il modo migliore per gestirlo. Cosa ne pensi di questo?

Christophe Trevisani Chavey.

+0

In realtà è il caching predefinito, è possibile disattivarlo se si aggiungono alcune opzioni di configurazione nel file di configurazione. Solo FYI – BlueSam

Problemi correlati