Pergunta

evitei trabalhar com FetchXML como eu fui sem saber a melhor maneira de lidar com os dados do resultado depois de chamar crmService.Fetch (FetchXML). Em um par de situações, eu usei um XDocument com LINQ para recuperar os dados desta estrutura de dados, tais como:

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);    
    }
}

Qual é a melhor maneira de lidar com dados do resultado FetchXML, de modo que possa ser facilmente utilizado. Aplicações como passar esses registros em um datagrid ASP.NET seria bastante útil.

Foi útil?

Solução

Eu normalmente evitar FetchXML por esta mesma razão. Você pode usar o RetrieveMultiple para obter fortemente tipado BusinessEntity objetos e fazer basicamente a mesma coisa.

Mas se você quiser usar o FetchXML esta amostra deve cobri-lo:

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

Outras dicas

Gosto da flexibilidade do FetchXML e assim que eu desenvolvi a seguinte função que retorna uma tabela de dados para uso em ligação às redes e repetidores e assim por diante.

        /// <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;
    }

A matriz de cadeia requiredfields está lá porque as colunas não são devolvidos se o seu conjunto de resultados não contém dados com essa coluna, no entanto eu poderia querer a coluna no lugar para a razão exata de se ligar a datagrids etc.

CrmService é uma classe singleton que initates o webservice.

Esperamos que este é de utilidade para você.

Com QueryExpression você não pode consulta muitos-para-muitos entidade e não pode recuperar os atributos de mais de uma entidade de uma só vez, então você deve usar FetchXML.

Infelizmente projeto codeplex de LinqToCRM foi transformado obsoletos (um ano sem nova autorização, mas parece ser uma boa implementação, melhor do que o lançamento do Microsoft) com o lançamento de 4.0.12 do SDK do CRM que continha um provedor LINQ para Dynamics CRM , mas eu li alguns artigos sobre este novo lançamento e não é muito bom, parece ser uma "má aplicação" com muitas limitações (forçado de cache etc.).

Eu vejo muitas pessoas usando LinqToXML e DataSet para líder com resultado FetchXML, mas eu não poderia dizer qual é a melhor maneira de lidar com ele. O que você acha sobre isso?

Christophe Trevisani Chavey.

Você também pode ir para LinqtoCRM, que vai lidar com a análise de XML para você: http://codeplex.com/linqtocrm

Se você quiser usar um FetchXML e obter um returnset do BusinessEntityType, você pode usar o método FetchXmlToQueryExpression para obter uma expressão de consulta do FetchXML e depois aplicar a expressão de consulta em um método RetrieveMultiple como em

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

Note-se que o método inverso QueryExpressiontoFetchXml existe assim

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top