7

crmService.Fetch(fetchXml)を呼び出した後に結果データを処理する最良の方法がわからないため、fetchxmlの使用を避けました。fetchxmlの結果データはどのように扱いますか?

それは簡単に使用することができるように、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);  
    } 
} 

:状況のカップルで、私のような、このデータ構造からデータを取得するためにLINQとXDocumentを使用していました。これらのレコードをASP.NETデータグリッドに渡すなどのアプリケーションは非常に便利です。

答えて

1

私は通常、このような理由でFetchXMLを避けています。 RetrieveMultipleを使用して、厳密に型指定されたBusinessEntityオブジェクトを取得し、基本的に同じ処理を実行できます。

しかし、もしあなたがFetchXMLを使用する場合は、このサンプルでは、​​あなたをカバーする必要があります:

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

+0

ええ、主にRetrieveMultipleを使用していますが、この場合、いくつかの属性を取得し、結合されたエンティティに基づいて条件を追加する必要があります。fetchXmlはこれを許可し、QueryExpressionオブジェクトは許可しません。 –

+0

ルーク、本当ですか?QueryExpressionによる検索には、結合を定義する方法もあります。 – okutane

+0

はい、結合を定義できますが、結合した要素から属性を返すことはできません。 –

6

私はFetchXMLの柔軟性を享受しているので、グリッドやリピータなどにバインディングするためのデータテーブルを返す次の関数を開発しました。

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

結果セットは、その列でデータが含まれていない場合は、列が返されていないためrequiredFieldsの文字列配列がある、しかし私は、データグリッドへの結合の正確な理由のための場所で列を望むかもしれないなど

CrmServiceは、Webサービスを初期化するシングルトンクラスです。

これはうまくいけばうまくいきます。

+0

+1鮮明な答え(返されたXMLを表に変換)を述べてくれてありがとう。 –

+0

HI Fishcake、これは華麗に見えます - 私はエラーが発生しています。 tomService = CrmWebService; "名前 'CrmWebService'は現在のコンテキストに存在しません。"ありがとう! – leddy

+0

**注意**: 'string result = tomService.Fetch(fetchXml);' *** ***は動作していません_CRM 2016_、***は非推奨です*** _CRM 2011_ – Kiquenet

0

あなたがfetchxmlを使用しBusinessEntityTypeのreturnsetを取得したい場合は、あなたがfetchxmlからクエリ式を取得するために FetchXmlToQueryExpressionメソッドを使用して、同様にRetrieveMultiple方法でクエリ式を適用することができます

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

逆方法QueryExpressiontoFetchXmlあなたは多対多のエンティティを照会することはできません、あなたがFetchXMLを使用しなければならないので、一度に複数のエンティティから属性を取得することができないのQueryExpressionと同様

1

が存在することに注意してください。

残念ながら、LinqToCRMのcodeplexプロジェクトは、ダイナミクスのためのlinqプロバイダを含むCRMのSDKの4.0.12のリリースで廃止されました(新しいリリースがなくても1年ですが、Microsoftのリリースより優れています) crm、しかし、私はこの新しいリリースについての記事を読んでいますが、それはあまり良くありませんが、多くの制限(強制キャッシュなど)を伴う「実装不良」のようです。

LinqToXMLとDataSetを使用してFetchXMLの結果を導く人々がたくさんいますが、それに対処する最良の方法は何も言えませんでした。あなたはこのことについてどう思いますか?

Christophe Trevisani Chavey。

+0

実際はデフォルトのキャッシュです。設定ファイルにいくつかの設定オプションを追加すると無効になります。ちょうどFYI – BlueSam

関連する問題