你如何处理fetchxml结果数据?

时间:2009-07-31 00:17:16

标签: xml data-structures dynamics-crm data-manipulation fetchxml

我已经避免使用fetchxml,因为我一直不确定在调用crmService.Fetch(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数据网格之类的应用程序将非常有用。

5 个答案:

答案 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字符串数组在那里,因为如果结果集中没有包含该列的数据,则不会返回列,但是我可能希望该列用于绑定到datagrids等的确切原因。

CrmService是一个启动Web服务的单例类。

希望这对你有用。

答案 1 :(得分:1)

出于这个原因,我通常会避免使用FetchXML。您可以使用RetrieveMultiple获取强类型的BusinessEntity对象,并基本上执行相同的操作。

但是如果你想使用FetchXML,这个样本应该包含你:

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

答案 2 :(得分:1)

使用QueryExpression,您无法查询多对多实体,也无法一次检索多个实体的属性,因此您必须使用FetchXML。

不幸的是,LinqToCRM的codeplex项目已经过时了(1年没有新版本,但它似乎是一个很好的实现,比微软的发布更好)随着4.0的CRM的SDK发布,其中包含动态crm的linq提供程序,但是我读了一些关于这个新版本的文章并且它不是很好,似乎是一个“很差的实现”,有很多限制(强制缓存等)。

我看到很多人使用LinqToXML和DataSet来领导FetchXML结果,但我不知道最好的处理方法是什么。你怎么看待这个?

Christophe Trevisani Chavey。

答案 3 :(得分:0)

您也可以选择LinqtoCRM,它将为您处理XML解析: http://codeplex.com/linqtocrm

答案 4 :(得分:0)

如果你想使用fetchxml并获得BusinessEntityType的returnset,你可以使用 FetchXmlToQueryExpression方法从fetchxml获取查询表达式,然后在RetrieveMultiple方法中应用查询表达式,如

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

请注意,反向方法QueryExpressiontoFetchXml也存在