2011-09-15 11 views
5

He estado convirtiendo algunos de mis complementos CRM4.0 para usar el CRM2011 SDK. Estoy empezando a trabajar con LINQ para las entidades de Early-Bound y me he encontrado con un problema.CRM 2011 - Recuperando valores formateados de la entidad unida

Estoy tratando de obtener el valor formateado de un OptionSetValue en una entidad unida. Después de mirar this MSDN SDK Query Example, logré recuperar los valores formateados para la entidad primaria, pero no puedo traducir eso a una entidad unida.

El siguiente código es una muestra de lo que estoy tratando de lograr. Empecé usando el código del ejemplo de 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(); 

Los account_formattedValues ​​y account_addresstypename encontrado corregido y tengo acceso a esos datos, pero por alguna razón el artículo contact_formattedValues ​​contiene una colección vacía, y por lo tanto contact_addresstypename es nulo.

¿Hago esto incorrectamente o me he perdido algo? ¿Alguien ha podido o sabe cómo lograr esto? Cualquier ayuda es muy apreciada.

Respuesta

8

Hay un error en el proveedor de consultas LINQ donde los valores formateados no se aplican correctamente a las entidades que siguen a la primera entidad. Se relaciona con la forma en que la API QueryExpression (que utiliza el proveedor de LINQ) maneja las consultas de unión. Lo hace agrupando todos los atributos y valores formateados en la primera entidad/primaria (técnicamente la única entidad). A continuación, utiliza un conjunto de "link aliases" para categorizar estos valores. Podemos explotar esto como una solución a los valores formateados faltantes.

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

notar todos los valores de etiqueta se extraen de la "a" parámetro, la parte difícil es saber lo que el valor de alias/prefijo es (para las entidades no primarias) que es una cadena creada dinámicamente sobre la base de la nombre del parámetro establecido por la entidad, "c", y un valor de contador. Esto puede inspeccionarse volcando los valores formateados de la entidad primaria.

+0

Excelente, ¡esto funcionó para mí! –

Cuestiones relacionadas