7

Ich habe vermieden, mit fetchxml zu arbeiten, da ich nicht sicher war, wie die Ergebnisdaten nach dem Aufruf von crmService.Fetch (fetchXml) am besten gehandhabt werden können. In ein paar Situationen, habe ich eine XDocument mit LINQ verwendet, um die Daten aus dieser Datenstruktur, wie abzurufen:Wie gehen Sie mit den fetchxml-Ergebnisdaten um?

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

Was ist der beste Weg FetchXML Ergebnisdaten zu handhaben, so dass es leicht verwendet werden kann, . Anwendungen wie das Übergeben dieser Datensätze an ein ASP.NET-Datagrid wären sehr nützlich.

Antwort

1

Ich vermeide typischerweise FetchXML aus genau diesem Grund. Sie können das RetrieveMultiple verwenden, um stark typisierte BusinessEntity-Objekte zu erhalten und im Grunde die gleichen Dinge zu tun.

Aber wenn Sie die FetchXML diese Probe verwenden möchten, sollten Sie decken:

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

+0

Ja, ich habe hauptsächlich RetrieveMultiple verwendet, aber in diesem Fall muss ich einige Attribute abrufen und einige Bedingungen basierend auf verbundenen Entitäten hinzufügen, die fetchXml mir erlauben wird, und das QueryExpression-Objekt wird nicht zulassen. –

+0

Luke, bist du sicher?Das Abrufen durch QueryExpression bietet auch Möglichkeiten zum Definieren von Joins. – okutane

+0

Ja, Sie können Joins definieren, aber ich bin ziemlich sicher, dass Sie keine Attribute von einer verbundenen Entität zurückgeben können. –

6

Ich genieße die Flexibilität von FetchXML und so entwickelte ich die folgende Funktion, die eine Datentabelle zur Verwendung bei der Bindung an Gitter und Repeater usw. zurückgibt.

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

Das Array requiredFields String ist da, weil Spalten nicht zurückgegeben werden, wenn die Ergebnismenge keine Daten mit dieser Spalte enthält jedoch die Spalte im Platz für den genauen Grund der Bindung an Datagrids usw. Ich könnte

will

CrmService ist eine Singleton-Klasse, die den Webservice initiiert.

Hoffentlich ist das für Sie von Nutzen.

+0

+1 Großartig, danke, dass Sie die klarste Antwort gegeben haben (indem Sie das zurückgegebene XML in eine Tabelle umgewandelt haben). –

+0

HI Fishcake, das sieht brilliant aus - ich erhalte zwar einen Fehler in der Zeile tomService = CrmWebService; "Der Name 'CrmWebService' existiert nicht im aktuellen Kontext" - bitte irgendwelche Ideen? Vielen Dank! – leddy

+0

** Hinweis **: 'string result = tomService.Fetch (fetchXml);' *** funktioniert nicht *** in _CRM 2016_ und *** veraltet *** in _CRM 2011_ – Kiquenet

0

Wenn Sie eine FetchXML verwenden und eine returnset des BusinessEntityType zu erhalten, können Sie die FetchXmlToQueryExpression Methode verwenden, um einen Abfrage-Ausdruck aus der FetchXML zu bekommen und dann den Abfrage-Ausdruck in einer RetrieveMultiple Methode anwenden wie in

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

Beachten Sie, dass die umgekehrte Methode QueryExpressiontoFetchXml

1

Mit Queryexpression und existiert nicht many-to-many-Entität abfragen kann und abrufen können keine Attribute von mehr als einer auf einmal Einheit, so müssen Sie FetchXML verwenden.

Leider ist das Codeplex-Projekt von LinqToCRM veraltet (1 Jahr ohne neue Version, aber es scheint eine gute Implementierung zu sein, besser als die Microsoft-Version) mit der Veröffentlichung von 4.0.12 des CRM SDK, das einen linq-Provider für Dynamics enthielt crm, aber ich habe einen Artikel über diese neue Version gelesen und es ist nicht sehr gut, scheint eine "schlechte Implementierung" mit vielen Einschränkungen (erzwungener Cache etc.) zu sein.

Ich sehe viele Menschen mit LinqToXML und DataSet für die Führung mit FetchXML Ergebnis, aber ich konnte nicht sagen, was der beste Weg, damit umzugehen. Was denkst du darüber?

Christophe Trevisani Chavey.

+0

Es ist eigentlich Standard-Caching, Sie können Schalten Sie es aus, wenn Sie der Konfigurationsdatei einige Konfigurationsoptionen hinzufügen. Nur zu deiner Information – BlueSam