你如何处理 fetchxml 结果数据?

How do you handle the fetchxml result data?

提问人:Luke Baulch 提问时间:7/31/2009 最后编辑:MattLuke Baulch 更新时间:5/4/2011 访问量:10665

问:

我避免使用 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 数据网格等应用程序将非常有用。

xml 数据结构 dynamics-crm 数据操作 fetchxml

评论


答:

1赞 brendan 7/31/2009 #1

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

但是,如果要使用 FetchXML,此示例应涵盖您:

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

评论

0赞 Luke Baulch 7/31/2009
是的,我一直主要使用 RetrieveMultiple,但在这种情况下,我需要检索一些属性并根据联接的实体添加一些条件,fetchXml 将允许我这样做,而 QueryExpression 对象将不允许。
0赞 okutane 7/31/2009
卢克,你确定吗?QueryExpression 的检索也有定义联接的方法。
0赞 Luke Baulch 7/31/2009
是的,您可以定义连接,但我相当确定您不能从连接的实体返回属性。
0赞 friism 7/31/2009 #2

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

6赞 Fishcake 8/11/2009 #3

我喜欢 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 服务的单一实例类。

希望这对你有用。

评论

0赞 Peter Majeed 12/21/2011
+1 太棒了,感谢您说出最清晰的答案(将返回的 XML 转换为表格)。
0赞 leddy 4/10/2015
嗨,鱼饼,这看起来很棒 - 我在 tomService = CrmWebService 行上收到错误;“'CrmWebService'这个名字在当前上下文中不存在” - 请问有什么想法吗?谢谢!
0赞 Kiquenet 10/19/2016
注意 CRM 2016 中不起作用,在 CRM 2011已弃用 string result = tomService.Fetch(fetchXml);
0赞 Stephane Dorrekens 9/9/2009 #4

如果要使用 fetchxml 并获取 BusinessEntityType 的返回集,则可以使用 FetchXmlToQueryExpression 方法,用于从 fetchxml 获取查询表达式,然后在 RetrieveMultiple 方法中应用查询表达式,如

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

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

1赞 Christophe Trevisani Chavey 8/31/2010 #5

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

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

我看到很多人使用 LinqToXML 和 DataSet 来引导 FetchXML 结果,但我无法说出处理它的最佳方法是什么。对此,你怎么看?

克里斯托夫·特雷维萨尼·查维。

评论

0赞 BlueSam 12/16/2010
它实际上是默认缓存,如果您在配置文件中添加一些配置选项,则可以将其关闭。仅供参考