Определенно используйте onload
. Разделите свои сценарии от Вашей страницы, или Вы сойдете с ума, пытаясь распутать их позже.
Я обычно избегаю FetchXML именно по этой причине. Вы можете использовать RetrieveMultiple для получения строго типизированных объектов BusinessEntity и в основном делать то же самое.
Но если вы хотите использовать FetchXML, этот пример должен вас охватить:
Вы также можете использовать LinqtoCRM, который будет обрабатывать синтаксический анализ XML за вас: http://codeplex.com/linqtocrm
Мне нравится гибкость 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 - это одноэлементный класс, который запускает веб-службу.
Надеюсь, это вам пригодится.
If you want to use a fetchxml AND get a returnset of the BusinessEntityType, you can use the FetchXmlToQueryExpression method to get a query expression from the fetchxml and then apply the query expression in a RetrieveMultiple method as in
FetchXmlToQueryExpressionResponse qe = (FetchXmlToQueryExpressionResponse) service.Execute(fetch);
Note that the reverse method QueryExpressiontoFetchXml exists as well
С помощью QueryExpression вы не можете запрашивать сущность "многие ко многим" и не можете извлекать атрибуты более чем из одной сущности одновременно, поэтому вы должны использовать FetchXML.
К сожалению, проект codeplex LinqToCRM устарел (1 год без нового релиза, но это, кажется, хорошая реализация, лучше, чем релиз от Microsoft) с выпуском 4.0.12 CRM SDK, который содержал поставщик linq для динамической crm. , но я прочитал какую-то статью об этом новом выпуске, и он не очень хорош, кажется, это «плохая реализация» с множеством ограничений (принудительный кеш и т. д.).
Я вижу много людей, использующих LinqToXML и DataSet для опережения результатов FetchXML, но я не могу сказать, как лучше всего с этим справиться. Что Вы думаете об этом?
Кристоф Тревизани Чави.