7

Unikałem pracy z fetchxml, ponieważ nie jestem pewien najlepszy sposób obsługi danych wynikowych po wywołaniu crmService.Fetch (fetchXml). W kilku sytuacjach, użyłem XDocument z LINQ, aby pobrać dane z tej struktury danych, takie jak:Jak radzić sobie z danymi wynikowymi 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);  
    } 
} 

Jaki jest najlepszy sposób obsłużyć fetchxml danych wynikowych, tak, że może być łatwo wykorzystane . Aplikacje takie jak przekazywanie tych rekordów do datagridu ASP.NET byłyby całkiem użyteczne.

Odpowiedz

1

Zwykle omijam FetchXML z tego właśnie powodu. Możesz użyć funkcji RetrieveMultiple, aby uzyskać silnie wpisane obiekty BusinessEntity i zrobić to samo.

Ale jeśli chcesz używać FetchXML próbka ta powinna obejmować cię:

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

+0

Tak, zostały głównie za pomocą RetrieveMultiple, ale w tym przypadku muszę odzyskać niektóre atrybuty i dodać kilka warunków na podstawie połączonych podmiotów, które fetchXml pozwoli mi zrobić, a obiekt QueryExpression nie pozwoli. –

+0

Luke, jesteś pewien?Pobieranie przez QueryExpression ma również sposoby definiowania złączeń. – okutane

+0

Tak, możesz definiować połączenia, ale jestem prawie pewien, że nie możesz zwrócić atrybutów z połączonej jednostki. –

6

Podoba mi się elastyczność FetchXML, dlatego opracowałem następującą funkcję, która zwraca dane, które można wykorzystać do wiązania siatek i repeaterów, i tak dalej.

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

Tablica ciąg requiredfields jest tam, ponieważ kolumny nie są zwracane, jeśli zestaw wyników zawiera żadnych danych z tej kolumny, ale może chcę kolumnę w miejscu dla dokładnego powodu wiązania z datagrids itp

CrmService to klasa pojedyncza, która inicjuje serwis WWW.

Mam nadzieję, że przyda ci się to.

+0

+1 Wspaniale, dziękuję za podanie najczystszej odpowiedzi (zwrot zwrócony XML do tabeli). –

+0

HI Fishcake, to wygląda świetnie - otrzymuję błąd na linii tomService = CrmWebService; "Nazwa" CrmWebService "nie istnieje w bieżącym kontekście" - jakieś pomysły proszę? Dzięki! – leddy

+0

** Uwaga **: 'string result = tomService.Fetch (fetchXml);' *** nie działa *** w _CRM 2016_, i *** jest przestarzałe *** w _CRM 2011_ – Kiquenet

0

Jeśli chcesz użyć fetchxml i uzyskać returnset z BusinessEntityType, można użyć metody FetchXmlToQueryExpression uzyskać wyrażenie kwerendy z fetchxml a następnie zastosować wyrażenie kwerendy w metodzie RetrieveMultiple jak w

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

należy zauważyć, że istnieje odwrotna metoda QueryExpressiontoFetchXml także

1

z QueryExpression nie może zapytać wiele-do-wielu podmiot i nie może odzyskać atrybuty z więcej niż jednego podmiotu na raz, więc trzeba użyć FetchXML.

Niestety, projekt codeplex LinqToCRM okazał się przestarzały (1 rok bez nowej wersji, ale wydaje się być dobrą implementacją, lepszą niż wydanie Microsoftu) z wydaniem 4.0.12 pakietu SDK CRM, który zawiera dostawcę linq dla dynamiki CRM, ale czytałem jakiś artykuł o tej nowej wersji i jej nie bardzo dobre, wydaje się być „słaba realizacja” z wieloma ograniczeniami (wymuszona cache itd.).

Widzę wiele osób używających LinqToXML i DataSet do prowadzenia z wynikiem FetchXML, ale nie mogłem powiedzieć, jak najlepiej sobie z tym poradzić. Co o tym myślisz?

Christophe Trevisani Chavey.

+0

To w rzeczywistości domyślne buforowanie, możesz wyłącz, jeśli dodasz niektóre opcje konfiguracyjne do pliku konfiguracyjnego. Po prostu dla FYI – BlueSam

Powiązane problemy