Как вы обрабатываете данные результатов fetchxml? - PullRequest
7 голосов
/ 31 июля 2009

Я избегал работы с 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, были бы весьма полезны.

Ответы [ 5 ]

6 голосов
/ 11 августа 2009

Мне нравится гибкость 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 - это одноэлементный класс, который запускает веб-сервис.

Надеюсь, это пригодится вам.

1 голос
/ 31 августа 2010

С QueryExpression вы не можете запрашивать сущность «многие ко многим» и не можете извлекать атрибуты сразу из нескольких сущностей, поэтому вы должны использовать FetchXML.

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

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

Кристоф Тревизани Чейви.

1 голос
/ 31 июля 2009

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

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

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

0 голосов
/ 09 сентября 2009

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

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

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

0 голосов
/ 31 июля 2009

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

...