7

crmService.Fetch(fetchXml)を呼び出した後、結果データを処理する最善の方法がわからないため、fetchxmlの使用を避けました。いくつかの状況で、私はLINQでXDocumentを使用して、次のようなこのデータ構造からデータを取得しました。

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

簡単に使用できるように、fetchxmlの結果データを処理するための最良の方法は何ですか。これらのレコードをASP.NETデータグリッドに渡すなどのアプリケーションは非常に便利です。

4

5 に答える 5

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サービスを開始するシングルトンクラスです。

うまくいけば、これはあなたに役立つでしょう。

于 2009-08-11T11:35:23.753 に答える
1

QueryExpressionを使用すると、多対多のエンティティにクエリを実行したり、一度に複数のエンティティから属性を取得したりできないため、FetchXMLを使用する必要があります。

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

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

クリストフ・トレビサニ・チャビー。

于 2010-08-31T14:26:47.143 に答える
1

私は通常、まさにこの理由でFetchXMLを避けています。RetrieveMultipleを使用して、強く型付けされたBusinessEntityオブジェクトを取得し、基本的に同じことを行うことができます。

ただし、FetchXMLを使用する場合は、このサンプルで次のことをカバーする必要があります。

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

于 2009-07-31T01:35:34.227 に答える
0

また、XML解析を処理するLinqtoCRMを使用することもできます: http ://codeplex.com/linqtocrm

于 2009-07-31T10:46:11.567 に答える
0

fetchxmlを使用してBusinessEntityTypeのリターンセットを取得する場合は、FetchXmlToQueryExpressionメソッドを使用してfetchxmlからクエリ式を取得し、次のようにRetrieveMultipleメソッドでクエリ式を適用できます。

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

逆のメソッドQueryExpressiontoFetchXmlも存在することに注意してください

于 2009-09-09T14:26:09.830 に答える