Как вы обрабатываете данные результата fetchxml?

я избегал работы с fetchxml, поскольку я не был уверен, лучший способ обработки данных результата после вызова crmService.Fetch (fetchXml). В нескольких ситуациях я использовал XDocument с LINQ для извлечения данных из этой структуры данных, таких как:

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 datagrid был бы весьма полезен.

5 ответов


Я обычно избегаю FetchXML именно по этой причине. Вы можете использовать RetrieveMultiple для получения строго типизированных объектов BusinessEntity и в основном делать то же самое.

но если вы хотите использовать FetchXML этот образец вам:

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


Мне нравится гибкость FetchXML, и поэтому я разработал следующую функцию, которая возвращает datatable для использования в привязке к сеткам и повторителям и так далее.

        /// <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-это одноэлементный класс, который инициирует вебсервис.

надеюсь, это вам.


с помощью QueryExpression вы не можете запрашивать объект "многие ко многим" и не можете получать атрибуты сразу из нескольких объектов, поэтому вы должны использовать FetchXML.

к сожалению, проект codeplex LinqToCRM был устаревшим (1 год без нового выпуска, но, похоже, это хорошая реализация, лучше, чем выпуск microsoft) с выпуском 4.0.12 SDK CRM, который содержал поставщика linq для dynamics crm, но я прочитал некоторую статью об этом новом выпуске и его не очень хорошо, кажется, "плохая реализация" с большим количеством ограничений (принудительный кэш и т. д.).

Я вижу много людей, использующих LinqToXML и DataSet для ведущих с результатом FetchXML, но я не мог сказать, что лучший способ справиться с этим. Что ты об этом думаешь?

Кристоф Chavey Associazioni Тревисани.


вы также можете перейти на LinqtoCRM, который будет обрабатывать синтаксический анализ XML для вас: http://codeplex.com/linqtocrm


Если вы хотите использовать fetchxml и получить returnset типа BusinessEntityType, вы можете использовать Fetchxmltoqueryexpression метод, чтобы получить выражение запроса из fetchxml, а затем применить выражение запроса в RetrieveMultiple метод, как в

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

обратите внимание, что обратный метод QueryExpressiontoFetchXml также существует