Как вы обрабатываете данные результата 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 этот образец вам:
Мне нравится гибкость 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 также существует