2011-09-15 10 views
5

Ho convertito alcuni dei miei plug-in CRM4.0 per utilizzare l'SDK CRM2011. Sto appena iniziando a lavorare con LINQ per le entità Early-Bound e ho riscontrato un problema.CRM 2011 - Recupero di valori formattati dall'entità unita

Sto cercando di ottenere il valore formattato di OptionSetValue in un'entità unita. Dopo aver esaminato this MSDN SDK Query Example, sono riuscito a recuperare i valori formattati per l'entità principale, ma non riesco a tradurlo in un'entità unificata.

Il codice seguente è un esempio di ciò che sto cercando di ottenere. Ho iniziato utilizzando il codice dell'esempio SDK.

var query_join8 = (from a in sContext.AccountSet 
        join c in sContext.ContactSet 
         on a.PrimaryContactId.Id equals c.ContactId 
         into gr 
        from c_joined in gr.DefaultIfEmpty() 
        select new 
           { 
            contact_name = c_joined.FullName, 
            account_name = a.Name, 
            account_addresstypecode = a.Address1_AddressTypeCode, 
            account_addresstypename = a.FormattedValues.ContainsKey("address1_addresstypecode") ? a.FormattedValues["address1_addresstypecode"] : null, 
            account_formattedValues = a.FormattedValues, 
            contact_addresstypecode = c_joined.Address1_AddressTypeCode, 
            contact_addresstypename = c_joined.FormattedValues.ContainsKey("address1_addresstypecode") ? c_joined.FormattedValues["address1_addresstypecode"] : null, 
            contact_formattedValues = c_joined.FormattedValues, 
           }).ToArray(); 

Le account_formattedValues ​​e account_addresstypename incontrato corretto e ho accesso a tali dati, ma per qualche motivo l'elemento contact_formattedValues ​​contiene un insieme vuoto, e quindi contact_addresstypename è nullo.

Sto facendo questo in modo non corretto, o ho perso qualcosa? Qualcuno è stato in grado o sa come raggiungerlo? Qualsiasi aiuto è molto apprezzato.

risposta

8

C'è un bug nel provider di query LINQ in cui i valori formattati non vengono applicati correttamente alle entità che seguono la prima entità. È correlato al modo in cui l'API QueryExpression (utilizzata dal provider LINQ) gestisce le query di join. Lo fa raggruppando tutti gli attributi e i valori formattati nella prima/primaria entità (tecnicamente l'unica entità). Quindi utilizza un set di "link aliases" per classificare questi valori. Possiamo sfruttarlo come soluzione alternativa ai FormattedValues ​​mancanti.

var acs = 
    from a in context.AccountSet 
    join c in context.ContactSet on a.PrimaryContactId.Id equals c.ContactId 
    into gr 
    from c_joined in gr.DefaultIfEmpty() 
    select new 
    { 
     account_addresstypecode = a.Address1_AddressTypeCode, 
     account_addresstypename = a.FormattedValues["address1_addresstypecode"], 
     contact_addresstypecode = c_joined.Address1_AddressTypeCode, 
     contact_addresstypename = a.FormattedValues["c_0.address1_addresstypecode"], 
     a.FormattedValues 
    }; 

foreach (var ac in acs) 
{ 
    foreach (var pair in ac.FormattedValues) 
    { 
     Console.WriteLine("{0} {1}", pair.Key, pair.Value); 
    } 
} 

Privacy tutti i valori di etichetta sono tirati dalla "a" parametro, la parte difficile è sapere quale sia il valore alias/prefisso è (per le entità non principali) che è una stringa creata dinamicamente in base alla nome del parametro impostato dall'entità, "c" e un valore del contatore. Questo può essere ispezionato scaricando i valori formattati dell'entità primaria.

+0

Eccellente, questo ha funzionato per me! –

Problemi correlati