2011-09-15 21 views
5

Przekształcałem niektóre z moich wtyczek CRM4.0, aby używać zestawu SDK CRM2011. Właśnie zaczynam pracę z LINQ dla podmiotów Early-Bound i natknąłem się na problem.CRM 2011 - Pobieranie wartości sformatowanych z przyłączonego obiektu

Próbuję uzyskać sformatowaną wartość parametru OptionSetValue w połączonym obiekcie. Po przejrzeniu this MSDN SDK Query Example udało mi się pobrać sformatowane wartości dla głównej jednostki, ale nie można tego przetłumaczyć na połączoną całość.

Poniższy kod jest próbką tego, co próbuję osiągnąć. Zacząłem od użycia kodu z przykładu 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(); 

W account_formattedValues ​​i account_addresstypename natknąć się poprawił i mam dostęp do tych danych, ale z jakiegoś powodu pozycja contact_formattedValues ​​zawiera zbiór pusty, a więc contact_addresstypename jest null.

Czy robię to niepoprawnie, czy też coś przeoczyłem? Czy ktoś był w stanie lub wie, jak to osiągnąć? Każda pomoc jest bardzo doceniana.

Odpowiedz

8

Występuje błąd w dostawcy zapytania LINQ, w którym sformatowane wartości nie są poprawnie stosowane do elementów następujących po pierwszym obiekcie. Jest to związane z tym, w jaki sposób API QueryExpression (używane przez dostawcę LINQ) obsługuje zapytania połączone. Czyni to poprzez łączenie wszystkich atrybutów i sformatowanych wartości w pierwszej/głównej jednostce (technicznie jedynej jednostce). Następnie wykorzystuje zestaw "link aliases", aby skategoryzować te wartości. Możemy wykorzystać to jako obejście brakujących wartości Formatted.

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

Zawiadomienie wszystkie wartości etykiet są pobierane z „a” parametr Najtrudniejsze jest wiedzieć, jaka jest wartość alias/prefix (dla podmiotów innych niż podstawowa), który jest dynamicznie utworzony ciąg w oparciu o nazwa parametru "entity-set", "c" i wartość licznika. Można to sprawdzić, przesyłając sformatowane wartości podstawowego elementu.

+0

Doskonale, to działało dla mnie! –

Powiązane problemy